home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / ARMTEX / SOURCES2 / !TeX / texmf / source / armTeX / web / c / tangle
Encoding:
Text File  |  1998-04-04  |  67.7 KB  |  3,204 lines

  1. #include "h.config"
  2. /* 9999 */ 
  3. #define bufsize 100 
  4. #define maxbytes 45000L 
  5. #define maxtoks 50000L 
  6. #define maxnames 4000 
  7. #define maxtexts 2000 
  8. #define hashsize 353 
  9. #define longestname 400 
  10. #define linelength 72 
  11. #define outbufsize 144 
  12. #define stacksize 100 
  13. #define maxidlength 50 
  14. #define unambiglength 20 
  15. typedef unsigned char ASCIIcode  ; 
  16. typedef file_ptr /* of  ASCIIcode */ textfile  ; 
  17. typedef unsigned char eightbits  ; 
  18. typedef integer sixteenbits  ; 
  19. typedef integer namepointer  ; 
  20. typedef integer textpointer  ; 
  21. typedef struct {
  22.     sixteenbits endfield ; 
  23.   sixteenbits bytefield ; 
  24.   namepointer namefield ; 
  25.   textpointer replfield ; 
  26.   integer modfield ; 
  27. } outputstate  ; 
  28. char history  ; 
  29. ASCIIcode xord[256]  ; 
  30. ASCIIcode xchr[256]  ; 
  31. textfile webfile  ; 
  32. textfile changefile  ; 
  33. textfile Pascalfile  ; 
  34. textfile pool  ; 
  35. ASCIIcode buffer[bufsize + 1]  ; 
  36. boolean phaseone  ; 
  37. ASCIIcode bytemem[3][maxbytes + 1]  ; 
  38. eightbits tokmem[4][maxtoks + 1]  ; 
  39. sixteenbits bytestart[maxnames + 1]  ; 
  40. sixteenbits tokstart[maxtexts + 1]  ; 
  41. sixteenbits link[maxnames + 1]  ; 
  42. sixteenbits ilk[maxnames + 1]  ; 
  43. sixteenbits equiv[maxnames + 1]  ; 
  44. sixteenbits textlink[maxtexts + 1]  ; 
  45. namepointer nameptr  ; 
  46. namepointer stringptr  ; 
  47. integer byteptr[3]  ; 
  48. integer poolchecksum  ; 
  49. textpointer textptr  ; 
  50. integer tokptr[4]  ; 
  51. char z  ; 
  52. integer idfirst  ; 
  53. integer idloc  ; 
  54. integer doublechars  ; 
  55. sixteenbits hash[hashsize + 1], chophash[hashsize + 1]  ; 
  56. ASCIIcode choppedid[unambiglength + 1]  ; 
  57. ASCIIcode modtext[longestname + 1]  ; 
  58. textpointer lastunnamed  ; 
  59. outputstate curstate  ; 
  60. outputstate stack[stacksize + 1]  ; 
  61. integer stackptr  ; 
  62. char zo  ; 
  63. eightbits bracelevel  ; 
  64. integer curval  ; 
  65. ASCIIcode outbuf[outbufsize + 1]  ; 
  66. integer outptr  ; 
  67. integer breakptr  ; 
  68. integer semiptr  ; 
  69. eightbits outstate  ; 
  70. integer outval, outapp  ; 
  71. ASCIIcode outsign  ; 
  72. schar lastsign  ; 
  73. ASCIIcode outcontrib[linelength + 1]  ; 
  74. integer ii  ; 
  75. integer line  ; 
  76. integer otherline  ; 
  77. integer templine  ; 
  78. integer limit  ; 
  79. integer loc  ; 
  80. boolean inputhasended  ; 
  81. boolean changing  ; 
  82. ASCIIcode changebuffer[bufsize + 1]  ; 
  83. integer changelimit  ; 
  84. namepointer curmodule  ; 
  85. boolean scanninghex  ; 
  86. eightbits nextcontrol  ; 
  87. textpointer currepltext  ; 
  88. integer modulecount  ; 
  89. char webname[PATHMAX + 1], chgname[PATHMAX + 1], pascalfilename[PATHMAX + 1], 
  90. poolfilename[PATHMAX + 1]  ; 
  91.  
  92. #include "h.tangle"
  93. void error ( ) 
  94. {integer j  ; 
  95.   integer k, l  ; 
  96.   if ( phaseone ) 
  97.   {
  98.     if ( changing ) 
  99.     Fputs( stdout ,  ". (change file " ) ; 
  100.     else
  101.     Fputs( stdout ,  ". (" ) ; 
  102.     fprintf( stdout , "%s%ld%c\n",  "l." , (long)line , ')' ) ; 
  103.     if ( loc >= limit ) 
  104.     l = limit ; 
  105.     else l = loc ; 
  106.     {register integer for_end; k = 1 ; for_end = l ; if ( k <= for_end) do 
  107.       if ( buffer [ k - 1 ] == 9 ) 
  108.       putc ( ' ' ,  stdout );
  109.       else
  110.       putc ( xchr [ buffer [ k - 1 ] ] ,  stdout );
  111.     while ( k++ < for_end ) ; } 
  112.     putc ('\n',  stdout );
  113.     {register integer for_end; k = 1 ; for_end = l ; if ( k <= for_end) do 
  114.       putc ( ' ' ,  stdout );
  115.     while ( k++ < for_end ) ; } 
  116.     {register integer for_end; k = l + 1 ; for_end = limit ; if ( k <= 
  117.     for_end) do 
  118.       putc ( xchr [ buffer [ k - 1 ] ] ,  stdout );
  119.     while ( k++ < for_end ) ; } 
  120.     putc ( ' ' ,  stdout );
  121.   } 
  122.   else {
  123.       
  124.     fprintf( stdout , "%s%ld%c\n",  ". (l." , (long)line , ')' ) ; 
  125.     {register integer for_end; j = 1 ; for_end = outptr ; if ( j <= for_end) 
  126.     do 
  127.       putc ( xchr [ outbuf [ j - 1 ] ] ,  stdout );
  128.     while ( j++ < for_end ) ; } 
  129.     Fputs( stdout ,  "... " ) ; 
  130.   } 
  131.   flush ( stdout ) ; 
  132.   history = 2 ; 
  133. void scanargs ( ) 
  134. {integer dotpos, slashpos, i, a  ; 
  135.   char c  ; 
  136.   char fname[PATHMAX + 1]  ; 
  137.   boolean foundweb, foundchange  ; 
  138.   foundweb = false ; 
  139.   foundchange = false ; 
  140.   {register integer for_end; a = 1 ; for_end = argc - 1 ; if ( a <= for_end) 
  141.   do 
  142.     {
  143.       argv ( a , fname ) ; 
  144.       if ( fname [ 1 ] != '-' ) 
  145.       {
  146.     if ( ! foundweb ) 
  147.     {
  148.       dotpos = -1 ; 
  149.       slashpos = -1 ; 
  150.       i = 1 ; 
  151.       while ( ( fname [ i ] != ' ' ) && ( i <= PATHMAX - 5 ) ) {
  152.           
  153.         webname [ i ] = fname [ i ] ; 
  154.         if ( fname [ i ] == '.' ) 
  155.         dotpos = i ; 
  156.         if ( fname [ i ] == '/' ) 
  157.         slashpos = i ; 
  158.         i = i + 1 ; 
  159.       } 
  160.       webname [ i ] = ' ' ; 
  161.       if ( ( dotpos == -1 ) || ( dotpos < slashpos ) ) 
  162.       {
  163.         dotpos = i ; 
  164.         webname [ dotpos ] = '.' ; 
  165.         webname [ dotpos + 1 ] = 'w' ; 
  166.         webname [ dotpos + 2 ] = 'e' ; 
  167.         webname [ dotpos + 3 ] = 'b' ; 
  168.         webname [ dotpos + 4 ] = ' ' ; 
  169.       } 
  170.       {register integer for_end; i = 1 ; for_end = dotpos ; if ( i <= 
  171.       for_end) do 
  172.         {
  173.           c = webname [ i ] ; 
  174.           pascalfilename [ i ] = c ; 
  175.           poolfilename [ i ] = c ; 
  176.         } 
  177.       while ( i++ < for_end ) ; } 
  178.       pascalfilename [ dotpos + 1 ] = 'p' ; 
  179.       pascalfilename [ dotpos + 2 ] = ' ' ; 
  180.       poolfilename [ dotpos + 1 ] = 'p' ; 
  181.       poolfilename [ dotpos + 2 ] = 'o' ; 
  182.       poolfilename [ dotpos + 3 ] = 'o' ; 
  183.       poolfilename [ dotpos + 4 ] = 'l' ; 
  184.       poolfilename [ dotpos + 5 ] = ' ' ; 
  185.       foundweb = true ; 
  186.     } 
  187.     else if ( ! foundchange ) 
  188.     {
  189.       dotpos = -1 ; 
  190.       slashpos = -1 ; 
  191.       i = 1 ; 
  192.       while ( ( fname [ i ] != ' ' ) && ( i <= PATHMAX - 5 ) ) {
  193.           
  194.         chgname [ i ] = fname [ i ] ; 
  195.         if ( fname [ i ] == '.' ) 
  196.         dotpos = i ; 
  197.         if ( fname [ i ] == '/' ) 
  198.         slashpos = i ; 
  199.         i = i + 1 ; 
  200.       } 
  201.       chgname [ i ] = ' ' ; 
  202.       if ( ( dotpos == -1 ) || ( dotpos < slashpos ) ) 
  203.       {
  204.         dotpos = i ; 
  205.         chgname [ dotpos ] = '.' ; 
  206.         chgname [ dotpos + 1 ] = 'c' ; 
  207.         chgname [ dotpos + 2 ] = 'h' ; 
  208.         chgname [ dotpos + 3 ] = ' ' ; 
  209.       } 
  210.       foundchange = true ; 
  211.     } 
  212.     else {
  213.         
  214.       fprintf( stdout , "%s\n",            "Usage: tangle webfile[.web] [changefile[.ch]] [-o file] [-p poolfile]"           ) ; 
  215.       uexit ( 1 ) ; 
  216.     } 
  217.       } 
  218.       else {
  219.       
  220.     if ( fname [ 2 ] == 'o' ) 
  221.     {
  222.       a = a + 1 ; 
  223.       argv ( a , pascalfilename ) ; 
  224.     } 
  225.     else if ( fname [ 2 ] == 'p' ) 
  226.     {
  227.       a = a + 1 ; 
  228.       argv ( a , poolfilename ) ; 
  229.     } 
  230.     else {
  231.         
  232.       fprintf( stdout , "%s\n",            "Usage: tangle webfile[.web] [changefile[.ch]] [-o file] [-p poolfile]"           ) ; 
  233.       uexit ( 1 ) ; 
  234.     } 
  235.       } 
  236.     } 
  237.   while ( a++ < for_end ) ; } 
  238.   if ( ! foundweb ) 
  239.   {
  240.     fprintf( stdout , "%s\n",      "Usage: tangle webfile[.web] [changefile[.ch]] [-o file] [-p poolfile]" ) 
  241.     ; 
  242.     uexit ( 1 ) ; 
  243.   } 
  244.   if ( ! foundchange ) 
  245.   {
  246.     chgname [ 1 ] = 'n' ; 
  247.     chgname [ 2 ] = 'u' ; 
  248.     chgname [ 3 ] = 'l' ; 
  249.     chgname [ 4 ] = 'l' ; 
  250.     chgname [ 5 ] = ':' ; 
  251.     chgname [ 6 ] = ' ' ; 
  252.   } 
  253. void initialize ( ) 
  254. {unsigned char i  ; 
  255.   char wi  ; 
  256.   char zi  ; 
  257.   integer h  ; 
  258.   history = 0 ; 
  259.   xchr [ 32 ] = ' ' ; 
  260.   xchr [ 33 ] = '!' ; 
  261.   xchr [ 34 ] = '"' ; 
  262.   xchr [ 35 ] = '#' ; 
  263.   xchr [ 36 ] = '$' ; 
  264.   xchr [ 37 ] = '%' ; 
  265.   xchr [ 38 ] = '&' ; 
  266.   xchr [ 39 ] = '\'' ; 
  267.   xchr [ 40 ] = '(' ; 
  268.   xchr [ 41 ] = ')' ; 
  269.   xchr [ 42 ] = '*' ; 
  270.   xchr [ 43 ] = '+' ; 
  271.   xchr [ 44 ] = ',' ; 
  272.   xchr [ 45 ] = '-' ; 
  273.   xchr [ 46 ] = '.' ; 
  274.   xchr [ 47 ] = '/' ; 
  275.   xchr [ 48 ] = '0' ; 
  276.   xchr [ 49 ] = '1' ; 
  277.   xchr [ 50 ] = '2' ; 
  278.   xchr [ 51 ] = '3' ; 
  279.   xchr [ 52 ] = '4' ; 
  280.   xchr [ 53 ] = '5' ; 
  281.   xchr [ 54 ] = '6' ; 
  282.   xchr [ 55 ] = '7' ; 
  283.   xchr [ 56 ] = '8' ; 
  284.   xchr [ 57 ] = '9' ; 
  285.   xchr [ 58 ] = ':' ; 
  286.   xchr [ 59 ] = ';' ; 
  287.   xchr [ 60 ] = '<' ; 
  288.   xchr [ 61 ] = '=' ; 
  289.   xchr [ 62 ] = '>' ; 
  290.   xchr [ 63 ] = '?' ; 
  291.   xchr [ 64 ] = '@' ; 
  292.   xchr [ 65 ] = 'A' ; 
  293.   xchr [ 66 ] = 'B' ; 
  294.   xchr [ 67 ] = 'C' ; 
  295.   xchr [ 68 ] = 'D' ; 
  296.   xchr [ 69 ] = 'E' ; 
  297.   xchr [ 70 ] = 'F' ; 
  298.   xchr [ 71 ] = 'G' ; 
  299.   xchr [ 72 ] = 'H' ; 
  300.   xchr [ 73 ] = 'I' ; 
  301.   xchr [ 74 ] = 'J' ; 
  302.   xchr [ 75 ] = 'K' ; 
  303.   xchr [ 76 ] = 'L' ; 
  304.   xchr [ 77 ] = 'M' ; 
  305.   xchr [ 78 ] = 'N' ; 
  306.   xchr [ 79 ] = 'O' ; 
  307.   xchr [ 80 ] = 'P' ; 
  308.   xchr [ 81 ] = 'Q' ; 
  309.   xchr [ 82 ] = 'R' ; 
  310.   xchr [ 83 ] = 'S' ; 
  311.   xchr [ 84 ] = 'T' ; 
  312.   xchr [ 85 ] = 'U' ; 
  313.   xchr [ 86 ] = 'V' ; 
  314.   xchr [ 87 ] = 'W' ; 
  315.   xchr [ 88 ] = 'X' ; 
  316.   xchr [ 89 ] = 'Y' ; 
  317.   xchr [ 90 ] = 'Z' ; 
  318.   xchr [ 91 ] = '[' ; 
  319.   xchr [ 92 ] = '\\' ; 
  320.   xchr [ 93 ] = ']' ; 
  321.   xchr [ 94 ] = '^' ; 
  322.   xchr [ 95 ] = '_' ; 
  323.   xchr [ 96 ] = '`' ; 
  324.   xchr [ 97 ] = 'a' ; 
  325.   xchr [ 98 ] = 'b' ; 
  326.   xchr [ 99 ] = 'c' ; 
  327.   xchr [ 100 ] = 'd' ; 
  328.   xchr [ 101 ] = 'e' ; 
  329.   xchr [ 102 ] = 'f' ; 
  330.   xchr [ 103 ] = 'g' ; 
  331.   xchr [ 104 ] = 'h' ; 
  332.   xchr [ 105 ] = 'i' ; 
  333.   xchr [ 106 ] = 'j' ; 
  334.   xchr [ 107 ] = 'k' ; 
  335.   xchr [ 108 ] = 'l' ; 
  336.   xchr [ 109 ] = 'm' ; 
  337.   xchr [ 110 ] = 'n' ; 
  338.   xchr [ 111 ] = 'o' ; 
  339.   xchr [ 112 ] = 'p' ; 
  340.   xchr [ 113 ] = 'q' ; 
  341.   xchr [ 114 ] = 'r' ; 
  342.   xchr [ 115 ] = 's' ; 
  343.   xchr [ 116 ] = 't' ; 
  344.   xchr [ 117 ] = 'u' ; 
  345.   xchr [ 118 ] = 'v' ; 
  346.   xchr [ 119 ] = 'w' ; 
  347.   xchr [ 120 ] = 'x' ; 
  348.   xchr [ 121 ] = 'y' ; 
  349.   xchr [ 122 ] = 'z' ; 
  350.   xchr [ 123 ] = '{' ; 
  351.   xchr [ 124 ] = '|' ; 
  352.   xchr [ 125 ] = '}' ; 
  353.   xchr [ 126 ] = '~' ; 
  354.   xchr [ 0 ] = ' ' ; 
  355.   xchr [ 127 ] = ' ' ; 
  356.   {register integer for_end; i = 1 ; for_end = 31 ; if ( i <= for_end) do 
  357.     xchr [ i ] = chr ( i ) ; 
  358.   while ( i++ < for_end ) ; } 
  359.   {register integer for_end; i = 128 ; for_end = 255 ; if ( i <= for_end) do 
  360.     xchr [ i ] = chr ( i ) ; 
  361.   while ( i++ < for_end ) ; } 
  362.   {register integer for_end; i = 0 ; for_end = 255 ; if ( i <= for_end) do 
  363.     xord [ chr ( i ) ] = 32 ; 
  364.   while ( i++ < for_end ) ; } 
  365.   {register integer for_end; i = 1 ; for_end = 255 ; if ( i <= for_end) do 
  366.     xord [ xchr [ i ] ] = i ; 
  367.   while ( i++ < for_end ) ; } 
  368.   xord [ ' ' ] = 32 ; 
  369.   scanargs () ; 
  370.   rewrite ( Pascalfile , pascalfilename ) ; 
  371.   {register integer for_end; wi = 0 ; for_end = 2 ; if ( wi <= for_end) do 
  372.     {
  373.       bytestart [ wi ] = 0 ; 
  374.       byteptr [ wi ] = 0 ; 
  375.     } 
  376.   while ( wi++ < for_end ) ; } 
  377.   bytestart [ 3 ] = 0 ; 
  378.   nameptr = 1 ; 
  379.   stringptr = 256 ; 
  380.   poolchecksum = 271828L ; 
  381.   {register integer for_end; zi = 0 ; for_end = 3 ; if ( zi <= for_end) do 
  382.     {
  383.       tokstart [ zi ] = 0 ; 
  384.       tokptr [ zi ] = 0 ; 
  385.     } 
  386.   while ( zi++ < for_end ) ; } 
  387.   tokstart [ 4 ] = 0 ; 
  388.   textptr = 1 ; 
  389.   z = 1 % 4 ; 
  390.   ilk [ 0 ] = 0 ; 
  391.   equiv [ 0 ] = 0 ; 
  392.   {register integer for_end; h = 0 ; for_end = hashsize - 1 ; if ( h <= 
  393.   for_end) do 
  394.     {
  395.       hash [ h ] = 0 ; 
  396.       chophash [ h ] = 0 ; 
  397.     } 
  398.   while ( h++ < for_end ) ; } 
  399.   lastunnamed = 0 ; 
  400.   textlink [ 0 ] = 0 ; 
  401.   scanninghex = false ; 
  402.   modtext [ 0 ] = 32 ; 
  403. void openinput ( ) 
  404. {reset ( webfile , webname ) ; 
  405.   reset ( changefile , chgname ) ; 
  406. boolean zinputln ( f ) 
  407. textfile f ; 
  408. {register boolean Result; integer finallimit  ; 
  409.   limit = 0 ; 
  410.   finallimit = 0 ; 
  411.   if ( eof ( f ) ) 
  412.   Result = false ; 
  413.   else {
  414.       
  415.     while ( ! eoln ( f ) ) {
  416.     
  417.       buffer [ limit ] = xord [ getc ( f ) ] ; 
  418.       limit = limit + 1 ; 
  419.       if ( buffer [ limit - 1 ] != 32 ) 
  420.       finallimit = limit ; 
  421.       if ( limit == bufsize ) 
  422.       {
  423.     while ( ! eoln ( f ) ) vgetc ( f ) ; 
  424.     limit = limit - 1 ; 
  425.     if ( finallimit > limit ) 
  426.     finallimit = limit ; 
  427.     {
  428.       putc ('\n',  stdout );
  429.       Fputs( stdout ,  "! Input line too long" ) ; 
  430.     } 
  431.     loc = 0 ; 
  432.     error () ; 
  433.       } 
  434.     } 
  435.     readln ( f ) ; 
  436.     limit = finallimit ; 
  437.     Result = true ; 
  438.   } 
  439.   return(Result) ; 
  440. void zprintid ( p ) 
  441. namepointer p ; 
  442. {integer k  ; 
  443.   char w  ; 
  444.   if ( p >= nameptr ) 
  445.   Fputs( stdout ,  "IMPOSSIBLE" ) ; 
  446.   else {
  447.       
  448.     w = p % 3 ; 
  449.     {register integer for_end; k = bytestart [ p ] ; for_end = bytestart [ p 
  450.     + 3 ] - 1 ; if ( k <= for_end) do 
  451.       putc ( xchr [ bytemem [ w ][ k ] ] ,  stdout );
  452.     while ( k++ < for_end ) ; } 
  453.   } 
  454. namepointer zidlookup ( t ) 
  455. eightbits t ; 
  456. {/* 31 32 */ register namepointer Result; eightbits c  ; 
  457.   integer i  ; 
  458.   integer h  ; 
  459.   integer k  ; 
  460.   char w  ; 
  461.   integer l  ; 
  462.   namepointer p, q  ; 
  463.   integer s  ; 
  464.   l = idloc - idfirst ; 
  465.   h = buffer [ idfirst ] ; 
  466.   i = idfirst + 1 ; 
  467.   while ( i < idloc ) {
  468.       
  469.     h = ( h + h + buffer [ i ] ) % hashsize ; 
  470.     i = i + 1 ; 
  471.   } 
  472.   p = hash [ h ] ; 
  473.   while ( p != 0 ) {
  474.       
  475.     if ( bytestart [ p + 3 ] - bytestart [ p ] == l ) 
  476.     {
  477.       i = idfirst ; 
  478.       k = bytestart [ p ] ; 
  479.       w = p % 3 ; 
  480.       while ( ( i < idloc ) && ( buffer [ i ] == bytemem [ w ][ k ] ) ) {
  481.       
  482.     i = i + 1 ; 
  483.     k = k + 1 ; 
  484.       } 
  485.       if ( i == idloc ) 
  486.       goto lab31 ; 
  487.     } 
  488.     p = link [ p ] ; 
  489.   } 
  490.   p = nameptr ; 
  491.   link [ p ] = hash [ h ] ; 
  492.   hash [ h ] = p ; 
  493.   lab31: ; 
  494.   if ( ( p == nameptr ) || ( t != 0 ) ) 
  495.   {
  496.     if ( ( ( p != nameptr ) && ( t != 0 ) && ( ilk [ p ] == 0 ) ) || ( ( p == 
  497.     nameptr ) && ( t == 0 ) && ( buffer [ idfirst ] != 34 ) ) ) 
  498.     {
  499.       i = idfirst ; 
  500.       s = 0 ; 
  501.       h = 0 ; 
  502.       while ( ( i < idloc ) && ( s < unambiglength ) ) {
  503.       
  504.     if ( buffer [ i ] != 95 ) 
  505.     {
  506.       if ( buffer [ i ] >= 97 ) 
  507.       choppedid [ s ] = buffer [ i ] - 32 ; 
  508.       else choppedid [ s ] = buffer [ i ] ; 
  509.       h = ( h + h + choppedid [ s ] ) % hashsize ; 
  510.       s = s + 1 ; 
  511.     } 
  512.     i = i + 1 ; 
  513.       } 
  514.       choppedid [ s ] = 0 ; 
  515.     } 
  516.     if ( p != nameptr ) 
  517.     {
  518.       if ( ilk [ p ] == 0 ) 
  519.       {
  520.     if ( t == 1 ) 
  521.     {
  522.       putc ('\n',  stdout );
  523.       Fputs( stdout ,  "! This identifier has already appeared" ) ; 
  524.       error () ; 
  525.     } 
  526.     q = chophash [ h ] ; 
  527.     if ( q == p ) 
  528.     chophash [ h ] = equiv [ p ] ; 
  529.     else {
  530.         
  531.       while ( equiv [ q ] != p ) q = equiv [ q ] ; 
  532.       equiv [ q ] = equiv [ p ] ; 
  533.     } 
  534.       } 
  535.       else {
  536.       
  537.     putc ('\n',  stdout );
  538.     Fputs( stdout ,  "! This identifier was defined before" ) ; 
  539.     error () ; 
  540.       } 
  541.       ilk [ p ] = t ; 
  542.     } 
  543.     else {
  544.     
  545.       if ( ( t == 0 ) && ( buffer [ idfirst ] != 34 ) ) 
  546.       {
  547.     q = chophash [ h ] ; 
  548.     while ( q != 0 ) {
  549.         
  550.       {
  551.         k = bytestart [ q ] ; 
  552.         s = 0 ; 
  553.         w = q % 3 ; 
  554.         while ( ( k < bytestart [ q + 3 ] ) && ( s < unambiglength ) ) {
  555.         
  556.           c = bytemem [ w ][ k ] ; 
  557.           if ( c != 95 ) 
  558.           {
  559.         if ( choppedid [ s ] != c ) 
  560.         goto lab32 ; 
  561.         s = s + 1 ; 
  562.           } 
  563.           k = k + 1 ; 
  564.         } 
  565.         if ( ( k == bytestart [ q + 3 ] ) && ( choppedid [ s ] != 0 ) ) 
  566.         goto lab32 ; 
  567.         {
  568.           putc ('\n',  stdout );
  569.           Fputs( stdout ,  "! Identifier conflict with " ) ; 
  570.         } 
  571.         {register integer for_end; k = bytestart [ q ] ; for_end = 
  572.         bytestart [ q + 3 ] - 1 ; if ( k <= for_end) do 
  573.           putc ( xchr [ bytemem [ w ][ k ] ] ,  stdout );
  574.         while ( k++ < for_end ) ; } 
  575.         error () ; 
  576.         q = 0 ; 
  577.         lab32: ; 
  578.       } 
  579.       q = equiv [ q ] ; 
  580.     } 
  581.     equiv [ p ] = chophash [ h ] ; 
  582.     chophash [ h ] = p ; 
  583.       } 
  584.       w = nameptr % 3 ; 
  585.       k = byteptr [ w ] ; 
  586.       if ( k + l > maxbytes ) 
  587.       {
  588.     putc ('\n',  stdout );
  589.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "byte memory" , " capacity exceeded" ) 
  590.     ; 
  591.     error () ; 
  592.     history = 3 ; 
  593.     uexit ( 1 ) ; 
  594.       } 
  595.       if ( nameptr > maxnames - 3 ) 
  596.       {
  597.     putc ('\n',  stdout );
  598.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "name" , " capacity exceeded" ) ; 
  599.     error () ; 
  600.     history = 3 ; 
  601.     uexit ( 1 ) ; 
  602.       } 
  603.       i = idfirst ; 
  604.       while ( i < idloc ) {
  605.       
  606.     bytemem [ w ][ k ] = buffer [ i ] ; 
  607.     k = k + 1 ; 
  608.     i = i + 1 ; 
  609.       } 
  610.       byteptr [ w ] = k ; 
  611.       bytestart [ nameptr + 3 ] = k ; 
  612.       nameptr = nameptr + 1 ; 
  613.       if ( buffer [ idfirst ] != 34 ) 
  614.       ilk [ p ] = t ; 
  615.       else {
  616.       
  617.     ilk [ p ] = 1 ; 
  618.     if ( l - doublechars == 2 ) 
  619.     equiv [ p ] = buffer [ idfirst + 1 ] + 32768L ; 
  620.     else {
  621.         
  622.       if ( stringptr == 256 ) 
  623.       rewrite ( pool , poolfilename ) ; 
  624.       equiv [ p ] = stringptr + 32768L ; 
  625.       l = l - doublechars - 1 ; 
  626.       if ( l > 99 ) 
  627.       {
  628.         putc ('\n',  stdout );
  629.         Fputs( stdout ,  "! Preprocessed string is too long" ) ; 
  630.         error () ; 
  631.       } 
  632.       stringptr = stringptr + 1 ; 
  633.       fprintf( pool , "%c%c",  xchr [ 48 + l / 10 ] , xchr [ 48 + l % 10 ] ) ; 
  634.       poolchecksum = poolchecksum + poolchecksum + l ; 
  635.       while ( poolchecksum > 536870839L ) poolchecksum = poolchecksum - 
  636.       536870839L ; 
  637.       i = idfirst + 1 ; 
  638.       while ( i < idloc ) {
  639.           
  640.         putc ( xchr [ buffer [ i ] ] ,  pool );
  641.         poolchecksum = poolchecksum + poolchecksum + buffer [ i ] ; 
  642.         while ( poolchecksum > 536870839L ) poolchecksum = poolchecksum - 
  643.         536870839L ; 
  644.         if ( ( buffer [ i ] == 34 ) || ( buffer [ i ] == 64 ) ) 
  645.         i = i + 2 ; 
  646.         else i = i + 1 ; 
  647.       } 
  648.       putc ('\n',  pool );
  649.     } 
  650.       } 
  651.     } 
  652.   } 
  653.   Result = p ; 
  654.   return(Result) ; 
  655. namepointer zmodlookup ( l ) 
  656. sixteenbits l ; 
  657. {/* 31 */ register namepointer Result; char c  ; 
  658.   integer j  ; 
  659.   integer k  ; 
  660.   char w  ; 
  661.   namepointer p  ; 
  662.   namepointer q  ; 
  663.   c = 2 ; 
  664.   q = 0 ; 
  665.   p = ilk [ 0 ] ; 
  666.   while ( p != 0 ) {
  667.       
  668.     {
  669.       k = bytestart [ p ] ; 
  670.       w = p % 3 ; 
  671.       c = 1 ; 
  672.       j = 1 ; 
  673.       while ( ( k < bytestart [ p + 3 ] ) && ( j <= l ) && ( modtext [ j ] == 
  674.       bytemem [ w ][ k ] ) ) {
  675.       
  676.     k = k + 1 ; 
  677.     j = j + 1 ; 
  678.       } 
  679.       if ( k == bytestart [ p + 3 ] ) 
  680.       if ( j > l ) 
  681.       c = 1 ; 
  682.       else c = 4 ; 
  683.       else if ( j > l ) 
  684.       c = 3 ; 
  685.       else if ( modtext [ j ] < bytemem [ w ][ k ] ) 
  686.       c = 0 ; 
  687.       else c = 2 ; 
  688.     } 
  689.     q = p ; 
  690.     if ( c == 0 ) 
  691.     p = link [ q ] ; 
  692.     else if ( c == 2 ) 
  693.     p = ilk [ q ] ; 
  694.     else goto lab31 ; 
  695.   } 
  696.   w = nameptr % 3 ; 
  697.   k = byteptr [ w ] ; 
  698.   if ( k + l > maxbytes ) 
  699.   {
  700.     putc ('\n',  stdout );
  701.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "byte memory" , " capacity exceeded" ) ; 
  702.     error () ; 
  703.     history = 3 ; 
  704.     uexit ( 1 ) ; 
  705.   } 
  706.   if ( nameptr > maxnames - 3 ) 
  707.   {
  708.     putc ('\n',  stdout );
  709.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "name" , " capacity exceeded" ) ; 
  710.     error () ; 
  711.     history = 3 ; 
  712.     uexit ( 1 ) ; 
  713.   } 
  714.   p = nameptr ; 
  715.   if ( c == 0 ) 
  716.   link [ q ] = p ; 
  717.   else ilk [ q ] = p ; 
  718.   link [ p ] = 0 ; 
  719.   ilk [ p ] = 0 ; 
  720.   c = 1 ; 
  721.   equiv [ p ] = 0 ; 
  722.   {register integer for_end; j = 1 ; for_end = l ; if ( j <= for_end) do 
  723.     bytemem [ w ][ k + j - 1 ] = modtext [ j ] ; 
  724.   while ( j++ < for_end ) ; } 
  725.   byteptr [ w ] = k + l ; 
  726.   bytestart [ nameptr + 3 ] = k + l ; 
  727.   nameptr = nameptr + 1 ; 
  728.   lab31: if ( c != 1 ) 
  729.   {
  730.     {
  731.       putc ('\n',  stdout );
  732.       Fputs( stdout ,  "! Incompatible section names" ) ; 
  733.       error () ; 
  734.     } 
  735.     p = 0 ; 
  736.   } 
  737.   Result = p ; 
  738.   return(Result) ; 
  739. namepointer zprefixlookup ( l ) 
  740. sixteenbits l ; 
  741. {register namepointer Result; char c  ; 
  742.   integer count  ; 
  743.   integer j  ; 
  744.   integer k  ; 
  745.   char w  ; 
  746.   namepointer p  ; 
  747.   namepointer q  ; 
  748.   namepointer r  ; 
  749.   q = 0 ; 
  750.   p = ilk [ 0 ] ; 
  751.   count = 0 ; 
  752.   r = 0 ; 
  753.   while ( p != 0 ) {
  754.       
  755.     {
  756.       k = bytestart [ p ] ; 
  757.       w = p % 3 ; 
  758.       c = 1 ; 
  759.       j = 1 ; 
  760.       while ( ( k < bytestart [ p + 3 ] ) && ( j <= l ) && ( modtext [ j ] == 
  761.       bytemem [ w ][ k ] ) ) {
  762.       
  763.     k = k + 1 ; 
  764.     j = j + 1 ; 
  765.       } 
  766.       if ( k == bytestart [ p + 3 ] ) 
  767.       if ( j > l ) 
  768.       c = 1 ; 
  769.       else c = 4 ; 
  770.       else if ( j > l ) 
  771.       c = 3 ; 
  772.       else if ( modtext [ j ] < bytemem [ w ][ k ] ) 
  773.       c = 0 ; 
  774.       else c = 2 ; 
  775.     } 
  776.     if ( c == 0 ) 
  777.     p = link [ p ] ; 
  778.     else if ( c == 2 ) 
  779.     p = ilk [ p ] ; 
  780.     else {
  781.     
  782.       r = p ; 
  783.       count = count + 1 ; 
  784.       q = ilk [ p ] ; 
  785.       p = link [ p ] ; 
  786.     } 
  787.     if ( p == 0 ) 
  788.     {
  789.       p = q ; 
  790.       q = 0 ; 
  791.     } 
  792.   } 
  793.   if ( count != 1 ) 
  794.   if ( count == 0 ) 
  795.   {
  796.     putc ('\n',  stdout );
  797.     Fputs( stdout ,  "! Name does not match" ) ; 
  798.     error () ; 
  799.   } 
  800.   else {
  801.       
  802.     putc ('\n',  stdout );
  803.     Fputs( stdout ,  "! Ambiguous prefix" ) ; 
  804.     error () ; 
  805.   } 
  806.   Result = r ; 
  807.   return(Result) ; 
  808. void zstoretwobytes ( x ) 
  809. sixteenbits x ; 
  810. {if ( tokptr [ z ] + 2 > maxtoks ) 
  811.   {
  812.     putc ('\n',  stdout );
  813.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) ; 
  814.     error () ; 
  815.     history = 3 ; 
  816.     uexit ( 1 ) ; 
  817.   } 
  818.   tokmem [ z ][ tokptr [ z ] ] = x / 256 ; 
  819.   tokmem [ z ][ tokptr [ z ] + 1 ] = x % 256 ; 
  820.   tokptr [ z ] = tokptr [ z ] + 2 ; 
  821. void zpushlevel ( p ) 
  822. namepointer p ; 
  823. {if ( stackptr == stacksize ) 
  824.   {
  825.     putc ('\n',  stdout );
  826.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "stack" , " capacity exceeded" ) ; 
  827.     error () ; 
  828.     history = 3 ; 
  829.     uexit ( 1 ) ; 
  830.   } 
  831.   else {
  832.       
  833.     stack [ stackptr ] = curstate ; 
  834.     stackptr = stackptr + 1 ; 
  835.     curstate .namefield = p ; 
  836.     curstate .replfield = equiv [ p ] ; 
  837.     zo = curstate .replfield % 4 ; 
  838.     curstate .bytefield = tokstart [ curstate .replfield ] ; 
  839.     curstate .endfield = tokstart [ curstate .replfield + 4 ] ; 
  840.     curstate .modfield = 0 ; 
  841.   } 
  842. void poplevel ( ) 
  843. {/* 10 */ if ( textlink [ curstate .replfield ] == 0 ) 
  844.   {
  845.     if ( ilk [ curstate .namefield ] == 3 ) 
  846.     {
  847.       nameptr = nameptr - 1 ; 
  848.       textptr = textptr - 1 ; 
  849.       z = textptr % 4 ; 
  850.       tokptr [ z ] = tokstart [ textptr ] ; 
  851.     } 
  852.   } 
  853.   else if ( textlink [ curstate .replfield ] < maxtexts ) 
  854.   {
  855.     curstate .replfield = textlink [ curstate .replfield ] ; 
  856.     zo = curstate .replfield % 4 ; 
  857.     curstate .bytefield = tokstart [ curstate .replfield ] ; 
  858.     curstate .endfield = tokstart [ curstate .replfield + 4 ] ; 
  859.     goto lab10 ; 
  860.   } 
  861.   stackptr = stackptr - 1 ; 
  862.   if ( stackptr > 0 ) 
  863.   {
  864.     curstate = stack [ stackptr ] ; 
  865.     zo = curstate .replfield % 4 ; 
  866.   } 
  867.   lab10: ; 
  868. sixteenbits getoutput ( ) 
  869. {/* 20 30 31 */ register sixteenbits Result; sixteenbits a  ; 
  870.   eightbits b  ; 
  871.   sixteenbits bal  ; 
  872.   integer k  ; 
  873.   char w  ; 
  874.   lab20: if ( stackptr == 0 ) 
  875.   {
  876.     a = 0 ; 
  877.     goto lab31 ; 
  878.   } 
  879.   if ( curstate .bytefield == curstate .endfield ) 
  880.   {
  881.     curval = - (integer) curstate .modfield ; 
  882.     poplevel () ; 
  883.     if ( curval == 0 ) 
  884.     goto lab20 ; 
  885.     a = 129 ; 
  886.     goto lab31 ; 
  887.   } 
  888.   a = tokmem [ zo ][ curstate .bytefield ] ; 
  889.   curstate .bytefield = curstate .bytefield + 1 ; 
  890.   if ( a < 128 ) 
  891.   if ( a == 0 ) 
  892.   {
  893.     pushlevel ( nameptr - 1 ) ; 
  894.     goto lab20 ; 
  895.   } 
  896.   else goto lab31 ; 
  897.   a = ( a - 128 ) * 256 + tokmem [ zo ][ curstate .bytefield ] ; 
  898.   curstate .bytefield = curstate .bytefield + 1 ; 
  899.   if ( a < 10240 ) 
  900.   {
  901.     switch ( ilk [ a ] ) 
  902.     {case 0 : 
  903.       {
  904.     curval = a ; 
  905.     a = 130 ; 
  906.       } 
  907.       break ; 
  908.     case 1 : 
  909.       {
  910.     curval = equiv [ a ] - 32768L ; 
  911.     a = 128 ; 
  912.       } 
  913.       break ; 
  914.     case 2 : 
  915.       {
  916.     pushlevel ( a ) ; 
  917.     goto lab20 ; 
  918.       } 
  919.       break ; 
  920.     case 3 : 
  921.       {
  922.     while ( ( curstate .bytefield == curstate .endfield ) && ( stackptr > 
  923.     0 ) ) poplevel () ; 
  924.     if ( ( stackptr == 0 ) || ( tokmem [ zo ][ curstate .bytefield ] != 40 
  925.     ) ) 
  926.     {
  927.       {
  928.         putc ('\n',  stdout );
  929.         Fputs( stdout ,  "! No parameter given for " ) ; 
  930.       } 
  931.       printid ( a ) ; 
  932.       error () ; 
  933.       goto lab20 ; 
  934.     } 
  935.     bal = 1 ; 
  936.     curstate .bytefield = curstate .bytefield + 1 ; 
  937.     while ( true ) {
  938.         
  939.       b = tokmem [ zo ][ curstate .bytefield ] ; 
  940.       curstate .bytefield = curstate .bytefield + 1 ; 
  941.       if ( b == 0 ) 
  942.       storetwobytes ( nameptr + 32767 ) ; 
  943.       else {
  944.           
  945.         if ( b >= 128 ) 
  946.         {
  947.           {
  948.         if ( tokptr [ z ] == maxtoks ) 
  949.         {
  950.           putc ('\n',  stdout );
  951.           fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" ,                   " capacity exceeded" ) ; 
  952.           error () ; 
  953.           history = 3 ; 
  954.           uexit ( 1 ) ; 
  955.         } 
  956.         tokmem [ z ][ tokptr [ z ] ] = b ; 
  957.         tokptr [ z ] = tokptr [ z ] + 1 ; 
  958.           } 
  959.           b = tokmem [ zo ][ curstate .bytefield ] ; 
  960.           curstate .bytefield = curstate .bytefield + 1 ; 
  961.         } 
  962.         else switch ( b ) 
  963.         {case 40 : 
  964.           bal = bal + 1 ; 
  965.           break ; 
  966.         case 41 : 
  967.           {
  968.         bal = bal - 1 ; 
  969.         if ( bal == 0 ) 
  970.         goto lab30 ; 
  971.           } 
  972.           break ; 
  973.         case 39 : 
  974.           do {
  975.           { 
  976.           if ( tokptr [ z ] == maxtoks ) 
  977.           {
  978.             putc ('\n',  stdout );
  979.             fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" ,                     " capacity exceeded" ) ; 
  980.             error () ; 
  981.             history = 3 ; 
  982.             uexit ( 1 ) ; 
  983.           } 
  984.           tokmem [ z ][ tokptr [ z ] ] = b ; 
  985.           tokptr [ z ] = tokptr [ z ] + 1 ; 
  986.         } 
  987.         b = tokmem [ zo ][ curstate .bytefield ] ; 
  988.         curstate .bytefield = curstate .bytefield + 1 ; 
  989.           } while ( ! ( b == 39 ) ) ; 
  990.           break ; 
  991.           default: 
  992.           ; 
  993.           break ; 
  994.         } 
  995.         {
  996.           if ( tokptr [ z ] == maxtoks ) 
  997.           {
  998.         putc ('\n',  stdout );
  999.         fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded"                 ) ; 
  1000.         error () ; 
  1001.         history = 3 ; 
  1002.         uexit ( 1 ) ; 
  1003.           } 
  1004.           tokmem [ z ][ tokptr [ z ] ] = b ; 
  1005.           tokptr [ z ] = tokptr [ z ] + 1 ; 
  1006.         } 
  1007.       } 
  1008.     } 
  1009.     lab30: ; 
  1010.     equiv [ nameptr ] = textptr ; 
  1011.     ilk [ nameptr ] = 2 ; 
  1012.     w = nameptr % 3 ; 
  1013.     k = byteptr [ w ] ; 
  1014.     if ( nameptr > maxnames - 3 ) 
  1015.     {
  1016.       putc ('\n',  stdout );
  1017.       fprintf( stdout , "%s%s%s",  "! Sorry, " , "name" , " capacity exceeded" ) ; 
  1018.       error () ; 
  1019.       history = 3 ; 
  1020.       uexit ( 1 ) ; 
  1021.     } 
  1022.     bytestart [ nameptr + 3 ] = k ; 
  1023.     nameptr = nameptr + 1 ; 
  1024.     if ( textptr > maxtexts - 4 ) 
  1025.     {
  1026.       putc ('\n',  stdout );
  1027.       fprintf( stdout , "%s%s%s",  "! Sorry, " , "text" , " capacity exceeded" ) ; 
  1028.       error () ; 
  1029.       history = 3 ; 
  1030.       uexit ( 1 ) ; 
  1031.     } 
  1032.     textlink [ textptr ] = 0 ; 
  1033.     tokstart [ textptr + 4 ] = tokptr [ z ] ; 
  1034.     textptr = textptr + 1 ; 
  1035.     z = textptr % 4 ; 
  1036.     pushlevel ( a ) ; 
  1037.     goto lab20 ; 
  1038.       } 
  1039.       break ; 
  1040.       default: 
  1041.       {
  1042.     putc ('\n',  stdout );
  1043.     fprintf( stdout , "%s%s%c",  "! This can't happen (" , "output" , ')' ) ; 
  1044.     error () ; 
  1045.     history = 3 ; 
  1046.     uexit ( 1 ) ; 
  1047.       } 
  1048.       break ; 
  1049.     } 
  1050.     goto lab31 ; 
  1051.   } 
  1052.   if ( a < 20480 ) 
  1053.   {
  1054.     a = a - 10240 ; 
  1055.     if ( equiv [ a ] != 0 ) 
  1056.     pushlevel ( a ) ; 
  1057.     else if ( a != 0 ) 
  1058.     {
  1059.       {
  1060.     putc ('\n',  stdout );
  1061.     Fputs( stdout ,  "! Not present: <" ) ; 
  1062.       } 
  1063.       printid ( a ) ; 
  1064.       putc ( '>' ,  stdout );
  1065.       error () ; 
  1066.     } 
  1067.     goto lab20 ; 
  1068.   } 
  1069.   curval = a - 20480 ; 
  1070.   a = 129 ; 
  1071.   curstate .modfield = curval ; 
  1072.   lab31: Result = a ; 
  1073.   return(Result) ; 
  1074. void flushbuffer ( ) 
  1075. {integer k  ; 
  1076.   integer b  ; 
  1077.   b = breakptr ; 
  1078.   if ( ( semiptr != 0 ) && ( outptr - semiptr <= linelength ) ) 
  1079.   breakptr = semiptr ; 
  1080.   {register integer for_end; k = 1 ; for_end = breakptr ; if ( k <= for_end) 
  1081.   do 
  1082.     putc ( xchr [ outbuf [ k - 1 ] ] ,  Pascalfile );
  1083.   while ( k++ < for_end ) ; } 
  1084.   putc ('\n',  Pascalfile );
  1085.   line = line + 1 ; 
  1086.   if ( line % 100 == 0 ) 
  1087.   {
  1088.     putc ( '.' ,  stdout );
  1089.     if ( line % 500 == 0 ) 
  1090.     fprintf( stdout , "%ld",  (long)line ) ; 
  1091.     flush ( stdout ) ; 
  1092.   } 
  1093.   if ( breakptr < outptr ) 
  1094.   {
  1095.     if ( outbuf [ breakptr ] == 32 ) 
  1096.     {
  1097.       breakptr = breakptr + 1 ; 
  1098.       if ( breakptr > b ) 
  1099.       b = breakptr ; 
  1100.     } 
  1101.     {register integer for_end; k = breakptr ; for_end = outptr - 1 ; if ( k 
  1102.     <= for_end) do 
  1103.       outbuf [ k - breakptr ] = outbuf [ k ] ; 
  1104.     while ( k++ < for_end ) ; } 
  1105.   } 
  1106.   outptr = outptr - breakptr ; 
  1107.   breakptr = b - breakptr ; 
  1108.   semiptr = 0 ; 
  1109.   if ( outptr > linelength ) 
  1110.   {
  1111.     {
  1112.       putc ('\n',  stdout );
  1113.       Fputs( stdout ,  "! Long line must be truncated" ) ; 
  1114.       error () ; 
  1115.     } 
  1116.     outptr = linelength ; 
  1117.   } 
  1118. void zappval ( v ) 
  1119. integer v ; 
  1120. {integer k  ; 
  1121.   k = outbufsize ; 
  1122.   do {
  1123.       outbuf [ k ] = v % 10 ; 
  1124.     v = v / 10 ; 
  1125.     k = k - 1 ; 
  1126.   } while ( ! ( v == 0 ) ) ; 
  1127.   do {
  1128.       k = k + 1 ; 
  1129.     {
  1130.       outbuf [ outptr ] = outbuf [ k ] + 48 ; 
  1131.       outptr = outptr + 1 ; 
  1132.     } 
  1133.   } while ( ! ( k == outbufsize ) ) ; 
  1134. void zsendout ( t , v ) 
  1135. eightbits t ; 
  1136. sixteenbits v ; 
  1137. {/* 20 */ integer k  ; 
  1138.   lab20: switch ( outstate ) 
  1139.   {case 1 : 
  1140.     if ( t != 3 ) 
  1141.     {
  1142.       breakptr = outptr ; 
  1143.       if ( t == 2 ) 
  1144.       {
  1145.     outbuf [ outptr ] = 32 ; 
  1146.     outptr = outptr + 1 ; 
  1147.       } 
  1148.     } 
  1149.     break ; 
  1150.   case 2 : 
  1151.     {
  1152.       {
  1153.     outbuf [ outptr ] = 44 - outapp ; 
  1154.     outptr = outptr + 1 ; 
  1155.       } 
  1156.       if ( outptr > linelength ) 
  1157.       flushbuffer () ; 
  1158.       breakptr = outptr ; 
  1159.     } 
  1160.     break ; 
  1161.   case 3 : 
  1162.   case 4 : 
  1163.     {
  1164.       if ( ( outval < 0 ) || ( ( outval == 0 ) && ( lastsign < 0 ) ) ) 
  1165.       {
  1166.     outbuf [ outptr ] = 45 ; 
  1167.     outptr = outptr + 1 ; 
  1168.       } 
  1169.       else if ( outsign > 0 ) 
  1170.       {
  1171.     outbuf [ outptr ] = outsign ; 
  1172.     outptr = outptr + 1 ; 
  1173.       } 
  1174.       appval ( abs ( outval ) ) ; 
  1175.       if ( outptr > linelength ) 
  1176.       flushbuffer () ; 
  1177.       outstate = outstate - 2 ; 
  1178.       goto lab20 ; 
  1179.     } 
  1180.     break ; 
  1181.   case 5 : 
  1182.     {
  1183.       if ( ( t == 3 ) || ( ( ( t == 2 ) && ( v == 3 ) && ( ( ( outcontrib [ 1 
  1184.       ] == 68 ) && ( outcontrib [ 2 ] == 73 ) && ( outcontrib [ 3 ] == 86 ) ) 
  1185.       || ( ( outcontrib [ 1 ] == 100 ) && ( outcontrib [ 2 ] == 105 ) && ( 
  1186.       outcontrib [ 3 ] == 118 ) ) || ( ( outcontrib [ 1 ] == 77 ) && ( 
  1187.       outcontrib [ 2 ] == 79 ) && ( outcontrib [ 3 ] == 68 ) ) || ( ( 
  1188.       outcontrib [ 1 ] == 109 ) && ( outcontrib [ 2 ] == 111 ) && ( outcontrib 
  1189.       [ 3 ] == 100 ) ) ) ) || ( ( t == 0 ) && ( ( v == 42 ) || ( v == 47 ) ) ) 
  1190.       ) ) 
  1191.       {
  1192.     if ( ( outval < 0 ) || ( ( outval == 0 ) && ( lastsign < 0 ) ) ) 
  1193.     {
  1194.       outbuf [ outptr ] = 45 ; 
  1195.       outptr = outptr + 1 ; 
  1196.     } 
  1197.     else if ( outsign > 0 ) 
  1198.     {
  1199.       outbuf [ outptr ] = outsign ; 
  1200.       outptr = outptr + 1 ; 
  1201.     } 
  1202.     appval ( abs ( outval ) ) ; 
  1203.     if ( outptr > linelength ) 
  1204.     flushbuffer () ; 
  1205.     outsign = 43 ; 
  1206.     outval = outapp ; 
  1207.       } 
  1208.       else outval = outval + outapp ; 
  1209.       outstate = 3 ; 
  1210.       goto lab20 ; 
  1211.     } 
  1212.     break ; 
  1213.   case 0 : 
  1214.     if ( t != 3 ) 
  1215.     breakptr = outptr ; 
  1216.     break ; 
  1217.     default: 
  1218.     ; 
  1219.     break ; 
  1220.   } 
  1221.   if ( t != 0 ) 
  1222.   {register integer for_end; k = 1 ; for_end = v ; if ( k <= for_end) do 
  1223.     {
  1224.       outbuf [ outptr ] = outcontrib [ k ] ; 
  1225.       outptr = outptr + 1 ; 
  1226.     } 
  1227.   while ( k++ < for_end ) ; } 
  1228.   else {
  1229.       
  1230.     outbuf [ outptr ] = v ; 
  1231.     outptr = outptr + 1 ; 
  1232.   } 
  1233.   if ( outptr > linelength ) 
  1234.   flushbuffer () ; 
  1235.   if ( ( t == 0 ) && ( ( v == 59 ) || ( v == 125 ) ) ) 
  1236.   {
  1237.     semiptr = outptr ; 
  1238.     breakptr = outptr ; 
  1239.   } 
  1240.   if ( t >= 2 ) 
  1241.   outstate = 1 ; 
  1242.   else outstate = 0 ; 
  1243. void zsendsign ( v ) 
  1244. integer v ; 
  1245. {switch ( outstate ) 
  1246.   {case 2 : 
  1247.   case 4 : 
  1248.     outapp = outapp * v ; 
  1249.     break ; 
  1250.   case 3 : 
  1251.     {
  1252.       outapp = v ; 
  1253.       outstate = 4 ; 
  1254.     } 
  1255.     break ; 
  1256.   case 5 : 
  1257.     {
  1258.       outval = outval + outapp ; 
  1259.       outapp = v ; 
  1260.       outstate = 4 ; 
  1261.     } 
  1262.     break ; 
  1263.     default: 
  1264.     {
  1265.       breakptr = outptr ; 
  1266.       outapp = v ; 
  1267.       outstate = 2 ; 
  1268.     } 
  1269.     break ; 
  1270.   } 
  1271.   lastsign = outapp ; 
  1272. void zsendval ( v ) 
  1273. integer v ; 
  1274. {/* 666 10 */ switch ( outstate ) 
  1275.   {case 1 : 
  1276.     {
  1277.       if ( ( outptr == breakptr + 3 ) || ( ( outptr == breakptr + 4 ) && ( 
  1278.       outbuf [ breakptr ] == 32 ) ) ) 
  1279.       if ( ( ( outbuf [ outptr - 3 ] == 68 ) && ( outbuf [ outptr - 2 ] == 73 
  1280.       ) && ( outbuf [ outptr - 1 ] == 86 ) ) || ( ( outbuf [ outptr - 3 ] == 
  1281.       100 ) && ( outbuf [ outptr - 2 ] == 105 ) && ( outbuf [ outptr - 1 ] == 
  1282.       118 ) ) || ( ( outbuf [ outptr - 3 ] == 77 ) && ( outbuf [ outptr - 2 ] 
  1283.       == 79 ) && ( outbuf [ outptr - 1 ] == 68 ) ) || ( ( outbuf [ outptr - 3 
  1284.       ] == 109 ) && ( outbuf [ outptr - 2 ] == 111 ) && ( outbuf [ outptr - 1 
  1285.       ] == 100 ) ) ) 
  1286.       goto lab666 ; 
  1287.       outsign = 32 ; 
  1288.       outstate = 3 ; 
  1289.       outval = v ; 
  1290.       breakptr = outptr ; 
  1291.       lastsign = 1 ; 
  1292.     } 
  1293.     break ; 
  1294.   case 0 : 
  1295.     {
  1296.       if ( ( outptr == breakptr + 1 ) && ( ( outbuf [ breakptr ] == 42 ) || ( 
  1297.       outbuf [ breakptr ] == 47 ) ) ) 
  1298.       goto lab666 ; 
  1299.       outsign = 0 ; 
  1300.       outstate = 3 ; 
  1301.       outval = v ; 
  1302.       breakptr = outptr ; 
  1303.       lastsign = 1 ; 
  1304.     } 
  1305.     break ; 
  1306.   case 2 : 
  1307.     {
  1308.       outsign = 43 ; 
  1309.       outstate = 3 ; 
  1310.       outval = outapp * v ; 
  1311.     } 
  1312.     break ; 
  1313.   case 3 : 
  1314.     {
  1315.       outstate = 5 ; 
  1316.       outapp = v ; 
  1317.       {
  1318.     putc ('\n',  stdout );
  1319.     Fputs( stdout ,  "! Two numbers occurred without a sign between them"         ) ; 
  1320.     error () ; 
  1321.       } 
  1322.     } 
  1323.     break ; 
  1324.   case 4 : 
  1325.     {
  1326.       outstate = 5 ; 
  1327.       outapp = outapp * v ; 
  1328.     } 
  1329.     break ; 
  1330.   case 5 : 
  1331.     {
  1332.       outval = outval + outapp ; 
  1333.       outapp = v ; 
  1334.       {
  1335.     putc ('\n',  stdout );
  1336.     Fputs( stdout ,  "! Two numbers occurred without a sign between them"         ) ; 
  1337.     error () ; 
  1338.       } 
  1339.     } 
  1340.     break ; 
  1341.     default: 
  1342.     goto lab666 ; 
  1343.     break ; 
  1344.   } 
  1345.   goto lab10 ; 
  1346.   lab666: if ( v >= 0 ) 
  1347.   {
  1348.     if ( outstate == 1 ) 
  1349.     {
  1350.       breakptr = outptr ; 
  1351.       {
  1352.     outbuf [ outptr ] = 32 ; 
  1353.     outptr = outptr + 1 ; 
  1354.       } 
  1355.     } 
  1356.     appval ( v ) ; 
  1357.     if ( outptr > linelength ) 
  1358.     flushbuffer () ; 
  1359.     outstate = 1 ; 
  1360.   } 
  1361.   else {
  1362.       
  1363.     {
  1364.       outbuf [ outptr ] = 40 ; 
  1365.       outptr = outptr + 1 ; 
  1366.     } 
  1367.     {
  1368.       outbuf [ outptr ] = 45 ; 
  1369.       outptr = outptr + 1 ; 
  1370.     } 
  1371.     appval ( - (integer) v ) ; 
  1372.     {
  1373.       outbuf [ outptr ] = 41 ; 
  1374.       outptr = outptr + 1 ; 
  1375.     } 
  1376.     if ( outptr > linelength ) 
  1377.     flushbuffer () ; 
  1378.     outstate = 0 ; 
  1379.   } 
  1380.   lab10: ; 
  1381. void sendtheoutput ( ) 
  1382. {/* 2 21 22 */ eightbits curchar  ; 
  1383.   integer k  ; 
  1384.   integer j  ; 
  1385.   char w  ; 
  1386.   integer n  ; 
  1387.   while ( stackptr > 0 ) {
  1388.       
  1389.     curchar = getoutput () ; 
  1390.     lab21: switch ( curchar ) 
  1391.     {case 0 : 
  1392.       ; 
  1393.       break ; 
  1394.     case 65 : 
  1395.     case 66 : 
  1396.     case 67 : 
  1397.     case 68 : 
  1398.     case 69 : 
  1399.     case 70 : 
  1400.     case 71 : 
  1401.     case 72 : 
  1402.     case 73 : 
  1403.     case 74 : 
  1404.     case 75 : 
  1405.     case 76 : 
  1406.     case 77 : 
  1407.     case 78 : 
  1408.     case 79 : 
  1409.     case 80 : 
  1410.     case 81 : 
  1411.     case 82 : 
  1412.     case 83 : 
  1413.     case 84 : 
  1414.     case 85 : 
  1415.     case 86 : 
  1416.     case 87 : 
  1417.     case 88 : 
  1418.     case 89 : 
  1419.     case 90 : 
  1420.     case 97 : 
  1421.     case 98 : 
  1422.     case 99 : 
  1423.     case 100 : 
  1424.     case 101 : 
  1425.     case 102 : 
  1426.     case 103 : 
  1427.     case 104 : 
  1428.     case 105 : 
  1429.     case 106 : 
  1430.     case 107 : 
  1431.     case 108 : 
  1432.     case 109 : 
  1433.     case 110 : 
  1434.     case 111 : 
  1435.     case 112 : 
  1436.     case 113 : 
  1437.     case 114 : 
  1438.     case 115 : 
  1439.     case 116 : 
  1440.     case 117 : 
  1441.     case 118 : 
  1442.     case 119 : 
  1443.     case 120 : 
  1444.     case 121 : 
  1445.     case 122 : 
  1446.       {
  1447.     outcontrib [ 1 ] = curchar ; 
  1448.     sendout ( 2 , 1 ) ; 
  1449.       } 
  1450.       break ; 
  1451.     case 130 : 
  1452.       {
  1453.     k = 0 ; 
  1454.     j = bytestart [ curval ] ; 
  1455.     w = curval % 3 ; 
  1456.     while ( ( k < maxidlength ) && ( j < bytestart [ curval + 3 ] ) ) {
  1457.         
  1458.       k = k + 1 ; 
  1459.       outcontrib [ k ] = bytemem [ w ][ j ] ; 
  1460.       j = j + 1 ; 
  1461.       if ( outcontrib [ k ] == 95 ) 
  1462.       k = k - 1 ; 
  1463.     } 
  1464.     sendout ( 2 , k ) ; 
  1465.       } 
  1466.       break ; 
  1467.     case 48 : 
  1468.     case 49 : 
  1469.     case 50 : 
  1470.     case 51 : 
  1471.     case 52 : 
  1472.     case 53 : 
  1473.     case 54 : 
  1474.     case 55 : 
  1475.     case 56 : 
  1476.     case 57 : 
  1477.       {
  1478.     n = 0 ; 
  1479.     do {
  1480.         curchar = curchar - 48 ; 
  1481.       if ( n >= 214748364L ) 
  1482.       {
  1483.         putc ('\n',  stdout );
  1484.         Fputs( stdout ,  "! Constant too big" ) ; 
  1485.         error () ; 
  1486.       } 
  1487.       else n = 10 * n + curchar ; 
  1488.       curchar = getoutput () ; 
  1489.     } while ( ! ( ( curchar > 57 ) || ( curchar < 48 ) ) ) ; 
  1490.     sendval ( n ) ; 
  1491.     k = 0 ; 
  1492.     if ( curchar == 101 ) 
  1493.     curchar = 69 ; 
  1494.     if ( curchar == 69 ) 
  1495.     goto lab2 ; 
  1496.     else goto lab21 ; 
  1497.       } 
  1498.       break ; 
  1499.     case 125 : 
  1500.       sendval ( poolchecksum ) ; 
  1501.       break ; 
  1502.     case 12 : 
  1503.       {
  1504.     n = 0 ; 
  1505.     curchar = 48 ; 
  1506.     do {
  1507.         curchar = curchar - 48 ; 
  1508.       if ( n >= 268435456L ) 
  1509.       {
  1510.         putc ('\n',  stdout );
  1511.         Fputs( stdout ,  "! Constant too big" ) ; 
  1512.         error () ; 
  1513.       } 
  1514.       else n = 8 * n + curchar ; 
  1515.       curchar = getoutput () ; 
  1516.     } while ( ! ( ( curchar > 55 ) || ( curchar < 48 ) ) ) ; 
  1517.     sendval ( n ) ; 
  1518.     goto lab21 ; 
  1519.       } 
  1520.       break ; 
  1521.     case 13 : 
  1522.       {
  1523.     n = 0 ; 
  1524.     curchar = 48 ; 
  1525.     do {
  1526.         if ( curchar >= 65 ) 
  1527.       curchar = curchar - 55 ; 
  1528.       else curchar = curchar - 48 ; 
  1529.       if ( n >= 134217728L ) 
  1530.       {
  1531.         putc ('\n',  stdout );
  1532.         Fputs( stdout ,  "! Constant too big" ) ; 
  1533.         error () ; 
  1534.       } 
  1535.       else n = 16 * n + curchar ; 
  1536.       curchar = getoutput () ; 
  1537.     } while ( ! ( ( curchar > 70 ) || ( curchar < 48 ) || ( ( curchar > 57 
  1538.     ) && ( curchar < 65 ) ) ) ) ; 
  1539.     sendval ( n ) ; 
  1540.     goto lab21 ; 
  1541.       } 
  1542.       break ; 
  1543.     case 128 : 
  1544.       sendval ( curval ) ; 
  1545.       break ; 
  1546.     case 46 : 
  1547.       {
  1548.     k = 1 ; 
  1549.     outcontrib [ 1 ] = 46 ; 
  1550.     curchar = getoutput () ; 
  1551.     if ( curchar == 46 ) 
  1552.     {
  1553.       outcontrib [ 2 ] = 46 ; 
  1554.       sendout ( 1 , 2 ) ; 
  1555.     } 
  1556.     else if ( ( curchar >= 48 ) && ( curchar <= 57 ) ) 
  1557.     goto lab2 ; 
  1558.     else {
  1559.         
  1560.       sendout ( 0 , 46 ) ; 
  1561.       goto lab21 ; 
  1562.     } 
  1563.       } 
  1564.       break ; 
  1565.     case 43 : 
  1566.     case 45 : 
  1567.       sendsign ( 44 - curchar ) ; 
  1568.       break ; 
  1569.     case 4 : 
  1570.       {
  1571.     outcontrib [ 1 ] = 97 ; 
  1572.     outcontrib [ 2 ] = 110 ; 
  1573.     outcontrib [ 3 ] = 100 ; 
  1574.     sendout ( 2 , 3 ) ; 
  1575.       } 
  1576.       break ; 
  1577.     case 5 : 
  1578.       {
  1579.     outcontrib [ 1 ] = 110 ; 
  1580.     outcontrib [ 2 ] = 111 ; 
  1581.     outcontrib [ 3 ] = 116 ; 
  1582.     sendout ( 2 , 3 ) ; 
  1583.       } 
  1584.       break ; 
  1585.     case 6 : 
  1586.       {
  1587.     outcontrib [ 1 ] = 105 ; 
  1588.     outcontrib [ 2 ] = 110 ; 
  1589.     sendout ( 2 , 2 ) ; 
  1590.       } 
  1591.       break ; 
  1592.     case 31 : 
  1593.       {
  1594.     outcontrib [ 1 ] = 111 ; 
  1595.     outcontrib [ 2 ] = 114 ; 
  1596.     sendout ( 2 , 2 ) ; 
  1597.       } 
  1598.       break ; 
  1599.     case 24 : 
  1600.       {
  1601.     outcontrib [ 1 ] = 58 ; 
  1602.     outcontrib [ 2 ] = 61 ; 
  1603.     sendout ( 1 , 2 ) ; 
  1604.       } 
  1605.       break ; 
  1606.     case 26 : 
  1607.       {
  1608.     outcontrib [ 1 ] = 60 ; 
  1609.     outcontrib [ 2 ] = 62 ; 
  1610.     sendout ( 1 , 2 ) ; 
  1611.       } 
  1612.       break ; 
  1613.     case 28 : 
  1614.       {
  1615.     outcontrib [ 1 ] = 60 ; 
  1616.     outcontrib [ 2 ] = 61 ; 
  1617.     sendout ( 1 , 2 ) ; 
  1618.       } 
  1619.       break ; 
  1620.     case 29 : 
  1621.       {
  1622.     outcontrib [ 1 ] = 62 ; 
  1623.     outcontrib [ 2 ] = 61 ; 
  1624.     sendout ( 1 , 2 ) ; 
  1625.       } 
  1626.       break ; 
  1627.     case 30 : 
  1628.       {
  1629.     outcontrib [ 1 ] = 61 ; 
  1630.     outcontrib [ 2 ] = 61 ; 
  1631.     sendout ( 1 , 2 ) ; 
  1632.       } 
  1633.       break ; 
  1634.     case 32 : 
  1635.       {
  1636.     outcontrib [ 1 ] = 46 ; 
  1637.     outcontrib [ 2 ] = 46 ; 
  1638.     sendout ( 1 , 2 ) ; 
  1639.       } 
  1640.       break ; 
  1641.     case 39 : 
  1642.       {
  1643.     k = 1 ; 
  1644.     outcontrib [ 1 ] = 39 ; 
  1645.     do {
  1646.         if ( k < linelength ) 
  1647.       k = k + 1 ; 
  1648.       outcontrib [ k ] = getoutput () ; 
  1649.     } while ( ! ( ( outcontrib [ k ] == 39 ) || ( stackptr == 0 ) ) ) ; 
  1650.     if ( k == linelength ) 
  1651.     {
  1652.       putc ('\n',  stdout );
  1653.       Fputs( stdout ,  "! String too long" ) ; 
  1654.       error () ; 
  1655.     } 
  1656.     sendout ( 1 , k ) ; 
  1657.     curchar = getoutput () ; 
  1658.     if ( curchar == 39 ) 
  1659.     outstate = 6 ; 
  1660.     goto lab21 ; 
  1661.       } 
  1662.       break ; 
  1663.     case 33 : 
  1664.     case 34 : 
  1665.     case 35 : 
  1666.     case 36 : 
  1667.     case 37 : 
  1668.     case 38 : 
  1669.     case 40 : 
  1670.     case 41 : 
  1671.     case 42 : 
  1672.     case 44 : 
  1673.     case 47 : 
  1674.     case 58 : 
  1675.     case 59 : 
  1676.     case 60 : 
  1677.     case 61 : 
  1678.     case 62 : 
  1679.     case 63 : 
  1680.     case 64 : 
  1681.     case 91 : 
  1682.     case 92 : 
  1683.     case 93 : 
  1684.     case 94 : 
  1685.     case 95 : 
  1686.     case 96 : 
  1687.     case 123 : 
  1688.     case 124 : 
  1689.       sendout ( 0 , curchar ) ; 
  1690.       break ; 
  1691.     case 9 : 
  1692.       {
  1693.     if ( bracelevel == 0 ) 
  1694.     sendout ( 0 , 123 ) ; 
  1695.     else sendout ( 0 , 91 ) ; 
  1696.     bracelevel = bracelevel + 1 ; 
  1697.       } 
  1698.       break ; 
  1699.     case 10 : 
  1700.       if ( bracelevel > 0 ) 
  1701.       {
  1702.     bracelevel = bracelevel - 1 ; 
  1703.     if ( bracelevel == 0 ) 
  1704.     sendout ( 0 , 125 ) ; 
  1705.     else sendout ( 0 , 93 ) ; 
  1706.       } 
  1707.       else {
  1708.       
  1709.     putc ('\n',  stdout );
  1710.     Fputs( stdout ,  "! Extra @}" ) ; 
  1711.     error () ; 
  1712.       } 
  1713.       break ; 
  1714.     case 129 : 
  1715.       {
  1716.     if ( bracelevel == 0 ) 
  1717.     sendout ( 0 , 123 ) ; 
  1718.     else sendout ( 0 , 91 ) ; 
  1719.     if ( curval < 0 ) 
  1720.     {
  1721.       sendout ( 0 , 58 ) ; 
  1722.       sendval ( - (integer) curval ) ; 
  1723.     } 
  1724.     else {
  1725.         
  1726.       sendval ( curval ) ; 
  1727.       sendout ( 0 , 58 ) ; 
  1728.     } 
  1729.     if ( bracelevel == 0 ) 
  1730.     sendout ( 0 , 125 ) ; 
  1731.     else sendout ( 0 , 93 ) ; 
  1732.       } 
  1733.       break ; 
  1734.     case 127 : 
  1735.       {
  1736.     sendout ( 3 , 0 ) ; 
  1737.     outstate = 6 ; 
  1738.       } 
  1739.       break ; 
  1740.     case 2 : 
  1741.       {
  1742.     k = 0 ; 
  1743.     do {
  1744.         if ( k < linelength ) 
  1745.       k = k + 1 ; 
  1746.       outcontrib [ k ] = getoutput () ; 
  1747.     } while ( ! ( ( outcontrib [ k ] == 2 ) || ( stackptr == 0 ) ) ) ; 
  1748.     if ( k == linelength ) 
  1749.     {
  1750.       putc ('\n',  stdout );
  1751.       Fputs( stdout ,  "! Verbatim string too long" ) ; 
  1752.       error () ; 
  1753.     } 
  1754.     sendout ( 1 , k - 1 ) ; 
  1755.       } 
  1756.       break ; 
  1757.     case 3 : 
  1758.       {
  1759.     sendout ( 1 , 0 ) ; 
  1760.     while ( outptr > 0 ) {
  1761.         
  1762.       if ( outptr <= linelength ) 
  1763.       breakptr = outptr ; 
  1764.       flushbuffer () ; 
  1765.     } 
  1766.     outstate = 0 ; 
  1767.       } 
  1768.       break ; 
  1769.       default: 
  1770.       {
  1771.     putc ('\n',  stdout );
  1772.     fprintf( stdout , "%s%ld",  "! Can't output ASCII code " , (long)curchar ) ; 
  1773.     error () ; 
  1774.       } 
  1775.       break ; 
  1776.     } 
  1777.     goto lab22 ; 
  1778.     lab2: do {
  1779.     if ( k < linelength ) 
  1780.       k = k + 1 ; 
  1781.       outcontrib [ k ] = curchar ; 
  1782.       curchar = getoutput () ; 
  1783.       if ( ( outcontrib [ k ] == 69 ) && ( ( curchar == 43 ) || ( curchar == 
  1784.       45 ) ) ) 
  1785.       {
  1786.     if ( k < linelength ) 
  1787.     k = k + 1 ; 
  1788.     outcontrib [ k ] = curchar ; 
  1789.     curchar = getoutput () ; 
  1790.       } 
  1791.       else if ( curchar == 101 ) 
  1792.       curchar = 69 ; 
  1793.     } while ( ! ( ( curchar != 69 ) && ( ( curchar < 48 ) || ( curchar > 57 ) 
  1794.     ) ) ) ; 
  1795.     if ( k == linelength ) 
  1796.     {
  1797.       putc ('\n',  stdout );
  1798.       Fputs( stdout ,  "! Fraction too long" ) ; 
  1799.       error () ; 
  1800.     } 
  1801.     sendout ( 3 , k ) ; 
  1802.     goto lab21 ; 
  1803.     lab22: ; 
  1804.   } 
  1805. boolean linesdontmatch ( ) 
  1806. {/* 10 */ register boolean Result; integer k  ; 
  1807.   Result = true ; 
  1808.   if ( changelimit != limit ) 
  1809.   goto lab10 ; 
  1810.   if ( limit > 0 ) 
  1811.   {register integer for_end; k = 0 ; for_end = limit - 1 ; if ( k <= for_end) 
  1812.   do 
  1813.     if ( changebuffer [ k ] != buffer [ k ] ) 
  1814.     goto lab10 ; 
  1815.   while ( k++ < for_end ) ; } 
  1816.   Result = false ; 
  1817.   lab10: ; 
  1818.   return(Result) ; 
  1819. void primethechangebuffer ( ) 
  1820. {/* 22 30 10 */ integer k  ; 
  1821.   changelimit = 0 ; 
  1822.   while ( true ) {
  1823.       
  1824.     line = line + 1 ; 
  1825.     if ( ! inputln ( changefile ) ) 
  1826.     goto lab10 ; 
  1827.     if ( limit < 2 ) 
  1828.     goto lab22 ; 
  1829.     if ( buffer [ 0 ] != 64 ) 
  1830.     goto lab22 ; 
  1831.     if ( ( buffer [ 1 ] >= 88 ) && ( buffer [ 1 ] <= 90 ) ) 
  1832.     buffer [ 1 ] = buffer [ 1 ] + 32 ; 
  1833.     if ( buffer [ 1 ] == 120 ) 
  1834.     goto lab30 ; 
  1835.     if ( ( buffer [ 1 ] == 121 ) || ( buffer [ 1 ] == 122 ) ) 
  1836.     {
  1837.       loc = 2 ; 
  1838.       {
  1839.     putc ('\n',  stdout );
  1840.     Fputs( stdout ,  "! Where is the matching @x?" ) ; 
  1841.     error () ; 
  1842.       } 
  1843.     } 
  1844.     lab22: ; 
  1845.   } 
  1846.   lab30: ; 
  1847.   do {
  1848.       line = line + 1 ; 
  1849.     if ( ! inputln ( changefile ) ) 
  1850.     {
  1851.       {
  1852.     putc ('\n',  stdout );
  1853.     Fputs( stdout ,  "! Change file ended after @x" ) ; 
  1854.     error () ; 
  1855.       } 
  1856.       goto lab10 ; 
  1857.     } 
  1858.   } while ( ! ( limit > 0 ) ) ; 
  1859.   {
  1860.     changelimit = limit ; 
  1861.     if ( limit > 0 ) 
  1862.     {register integer for_end; k = 0 ; for_end = limit - 1 ; if ( k <= 
  1863.     for_end) do 
  1864.       changebuffer [ k ] = buffer [ k ] ; 
  1865.     while ( k++ < for_end ) ; } 
  1866.   } 
  1867.   lab10: ; 
  1868. void checkchange ( ) 
  1869. {/* 10 */ integer n  ; 
  1870.   integer k  ; 
  1871.   if ( linesdontmatch () ) 
  1872.   goto lab10 ; 
  1873.   n = 0 ; 
  1874.   while ( true ) {
  1875.       
  1876.     changing = ! changing ; 
  1877.     templine = otherline ; 
  1878.     otherline = line ; 
  1879.     line = templine ; 
  1880.     line = line + 1 ; 
  1881.     if ( ! inputln ( changefile ) ) 
  1882.     {
  1883.       {
  1884.     putc ('\n',  stdout );
  1885.     Fputs( stdout ,  "! Change file ended before @y" ) ; 
  1886.     error () ; 
  1887.       } 
  1888.       changelimit = 0 ; 
  1889.       changing = ! changing ; 
  1890.       templine = otherline ; 
  1891.       otherline = line ; 
  1892.       line = templine ; 
  1893.       goto lab10 ; 
  1894.     } 
  1895.     if ( limit > 1 ) 
  1896.     if ( buffer [ 0 ] == 64 ) 
  1897.     {
  1898.       if ( ( buffer [ 1 ] >= 88 ) && ( buffer [ 1 ] <= 90 ) ) 
  1899.       buffer [ 1 ] = buffer [ 1 ] + 32 ; 
  1900.       if ( ( buffer [ 1 ] == 120 ) || ( buffer [ 1 ] == 122 ) ) 
  1901.       {
  1902.     loc = 2 ; 
  1903.     {
  1904.       putc ('\n',  stdout );
  1905.       Fputs( stdout ,  "! Where is the matching @y?" ) ; 
  1906.       error () ; 
  1907.     } 
  1908.       } 
  1909.       else if ( buffer [ 1 ] == 121 ) 
  1910.       {
  1911.     if ( n > 0 ) 
  1912.     {
  1913.       loc = 2 ; 
  1914.       {
  1915.         putc ('\n',  stdout );
  1916.         fprintf( stdout , "%s%ld%s",  "! Hmm... " , (long)n ,             " of the preceding lines failed to match" ) ; 
  1917.         error () ; 
  1918.       } 
  1919.     } 
  1920.     goto lab10 ; 
  1921.       } 
  1922.     } 
  1923.     {
  1924.       changelimit = limit ; 
  1925.       if ( limit > 0 ) 
  1926.       {register integer for_end; k = 0 ; for_end = limit - 1 ; if ( k <= 
  1927.       for_end) do 
  1928.     changebuffer [ k ] = buffer [ k ] ; 
  1929.       while ( k++ < for_end ) ; } 
  1930.     } 
  1931.     changing = ! changing ; 
  1932.     templine = otherline ; 
  1933.     otherline = line ; 
  1934.     line = templine ; 
  1935.     line = line + 1 ; 
  1936.     if ( ! inputln ( webfile ) ) 
  1937.     {
  1938.       {
  1939.     putc ('\n',  stdout );
  1940.     Fputs( stdout ,  "! WEB file ended during a change" ) ; 
  1941.     error () ; 
  1942.       } 
  1943.       inputhasended = true ; 
  1944.       goto lab10 ; 
  1945.     } 
  1946.     if ( linesdontmatch () ) 
  1947.     n = n + 1 ; 
  1948.   } 
  1949.   lab10: ; 
  1950. void getline ( ) 
  1951. {/* 20 */ lab20: if ( changing ) 
  1952.   {
  1953.     line = line + 1 ; 
  1954.     if ( ! inputln ( changefile ) ) 
  1955.     {
  1956.       {
  1957.     putc ('\n',  stdout );
  1958.     Fputs( stdout ,  "! Change file ended without @z" ) ; 
  1959.     error () ; 
  1960.       } 
  1961.       buffer [ 0 ] = 64 ; 
  1962.       buffer [ 1 ] = 122 ; 
  1963.       limit = 2 ; 
  1964.     } 
  1965.     if ( limit > 1 ) 
  1966.     if ( buffer [ 0 ] == 64 ) 
  1967.     {
  1968.       if ( ( buffer [ 1 ] >= 88 ) && ( buffer [ 1 ] <= 90 ) ) 
  1969.       buffer [ 1 ] = buffer [ 1 ] + 32 ; 
  1970.       if ( ( buffer [ 1 ] == 120 ) || ( buffer [ 1 ] == 121 ) ) 
  1971.       {
  1972.     loc = 2 ; 
  1973.     {
  1974.       putc ('\n',  stdout );
  1975.       Fputs( stdout ,  "! Where is the matching @z?" ) ; 
  1976.       error () ; 
  1977.     } 
  1978.       } 
  1979.       else if ( buffer [ 1 ] == 122 ) 
  1980.       {
  1981.     primethechangebuffer () ; 
  1982.     changing = ! changing ; 
  1983.     templine = otherline ; 
  1984.     otherline = line ; 
  1985.     line = templine ; 
  1986.       } 
  1987.     } 
  1988.   } 
  1989.   if ( ! changing ) 
  1990.   {
  1991.     {
  1992.       line = line + 1 ; 
  1993.       if ( ! inputln ( webfile ) ) 
  1994.       inputhasended = true ; 
  1995.       else if ( limit == changelimit ) 
  1996.       if ( buffer [ 0 ] == changebuffer [ 0 ] ) 
  1997.       if ( changelimit > 0 ) 
  1998.       checkchange () ; 
  1999.     } 
  2000.     if ( changing ) 
  2001.     goto lab20 ; 
  2002.   } 
  2003.   loc = 0 ; 
  2004.   buffer [ limit ] = 32 ; 
  2005. eightbits zcontrolcode ( c ) 
  2006. ASCIIcode c ; 
  2007. {register eightbits Result; switch ( c ) 
  2008.   {case 64 : 
  2009.     Result = 64 ; 
  2010.     break ; 
  2011.   case 39 : 
  2012.     Result = 12 ; 
  2013.     break ; 
  2014.   case 34 : 
  2015.     Result = 13 ; 
  2016.     break ; 
  2017.   case 36 : 
  2018.     Result = 125 ; 
  2019.     break ; 
  2020.   case 32 : 
  2021.   case 9 : 
  2022.     Result = 136 ; 
  2023.     break ; 
  2024.   case 42 : 
  2025.     {
  2026.       fprintf( stdout , "%c%ld",  '*' , (long)modulecount + 1 ) ; 
  2027.       flush ( stdout ) ; 
  2028.       Result = 136 ; 
  2029.     } 
  2030.     break ; 
  2031.   case 68 : 
  2032.   case 100 : 
  2033.     Result = 133 ; 
  2034.     break ; 
  2035.   case 70 : 
  2036.   case 102 : 
  2037.     Result = 132 ; 
  2038.     break ; 
  2039.   case 123 : 
  2040.     Result = 9 ; 
  2041.     break ; 
  2042.   case 125 : 
  2043.     Result = 10 ; 
  2044.     break ; 
  2045.   case 80 : 
  2046.   case 112 : 
  2047.     Result = 134 ; 
  2048.     break ; 
  2049.   case 84 : 
  2050.   case 116 : 
  2051.   case 94 : 
  2052.   case 46 : 
  2053.   case 58 : 
  2054.     Result = 131 ; 
  2055.     break ; 
  2056.   case 38 : 
  2057.     Result = 127 ; 
  2058.     break ; 
  2059.   case 60 : 
  2060.     Result = 135 ; 
  2061.     break ; 
  2062.   case 61 : 
  2063.     Result = 2 ; 
  2064.     break ; 
  2065.   case 92 : 
  2066.     Result = 3 ; 
  2067.     break ; 
  2068.     default: 
  2069.     Result = 0 ; 
  2070.     break ; 
  2071.   } 
  2072.   return(Result) ; 
  2073. eightbits skipahead ( ) 
  2074. {/* 30 */ register eightbits Result; eightbits c  ; 
  2075.   while ( true ) {
  2076.       
  2077.     if ( loc > limit ) 
  2078.     {
  2079.       getline () ; 
  2080.       if ( inputhasended ) 
  2081.       {
  2082.     c = 136 ; 
  2083.     goto lab30 ; 
  2084.       } 
  2085.     } 
  2086.     buffer [ limit + 1 ] = 64 ; 
  2087.     while ( buffer [ loc ] != 64 ) loc = loc + 1 ; 
  2088.     if ( loc <= limit ) 
  2089.     {
  2090.       loc = loc + 2 ; 
  2091.       c = controlcode ( buffer [ loc - 1 ] ) ; 
  2092.       if ( ( c != 0 ) || ( buffer [ loc - 1 ] == 62 ) ) 
  2093.       goto lab30 ; 
  2094.     } 
  2095.   } 
  2096.   lab30: Result = c ; 
  2097.   return(Result) ; 
  2098. void skipcomment ( ) 
  2099. {/* 10 */ eightbits bal  ; 
  2100.   ASCIIcode c  ; 
  2101.   bal = 0 ; 
  2102.   while ( true ) {
  2103.       
  2104.     if ( loc > limit ) 
  2105.     {
  2106.       getline () ; 
  2107.       if ( inputhasended ) 
  2108.       {
  2109.     {
  2110.       putc ('\n',  stdout );
  2111.       Fputs( stdout ,  "! Input ended in mid-comment" ) ; 
  2112.       error () ; 
  2113.     } 
  2114.     goto lab10 ; 
  2115.       } 
  2116.     } 
  2117.     c = buffer [ loc ] ; 
  2118.     loc = loc + 1 ; 
  2119.     if ( c == 64 ) 
  2120.     {
  2121.       c = buffer [ loc ] ; 
  2122.       if ( ( c != 32 ) && ( c != 9 ) && ( c != 42 ) && ( c != 122 ) && ( c != 
  2123.       90 ) ) 
  2124.       loc = loc + 1 ; 
  2125.       else {
  2126.       
  2127.     {
  2128.       putc ('\n',  stdout );
  2129.       Fputs( stdout ,  "! Section ended in mid-comment" ) ; 
  2130.       error () ; 
  2131.     } 
  2132.     loc = loc - 1 ; 
  2133.     goto lab10 ; 
  2134.       } 
  2135.     } 
  2136.     else if ( ( c == 92 ) && ( buffer [ loc ] != 64 ) ) 
  2137.     loc = loc + 1 ; 
  2138.     else if ( c == 123 ) 
  2139.     bal = bal + 1 ; 
  2140.     else if ( c == 125 ) 
  2141.     {
  2142.       if ( bal == 0 ) 
  2143.       goto lab10 ; 
  2144.       bal = bal - 1 ; 
  2145.     } 
  2146.   } 
  2147.   lab10: ; 
  2148. eightbits getnext ( ) 
  2149. {/* 20 30 31 */ register eightbits Result; eightbits c  ; 
  2150.   eightbits d  ; 
  2151.   integer j, k  ; 
  2152.   lab20: if ( loc > limit ) 
  2153.   {
  2154.     getline () ; 
  2155.     if ( inputhasended ) 
  2156.     {
  2157.       c = 136 ; 
  2158.       goto lab31 ; 
  2159.     } 
  2160.   } 
  2161.   c = buffer [ loc ] ; 
  2162.   loc = loc + 1 ; 
  2163.   if ( scanninghex ) 
  2164.   if ( ( ( c >= 48 ) && ( c <= 57 ) ) || ( ( c >= 65 ) && ( c <= 70 ) ) ) 
  2165.   goto lab31 ; 
  2166.   else scanninghex = false ; 
  2167.   switch ( c ) 
  2168.   {case 65 : 
  2169.   case 66 : 
  2170.   case 67 : 
  2171.   case 68 : 
  2172.   case 69 : 
  2173.   case 70 : 
  2174.   case 71 : 
  2175.   case 72 : 
  2176.   case 73 : 
  2177.   case 74 : 
  2178.   case 75 : 
  2179.   case 76 : 
  2180.   case 77 : 
  2181.   case 78 : 
  2182.   case 79 : 
  2183.   case 80 : 
  2184.   case 81 : 
  2185.   case 82 : 
  2186.   case 83 : 
  2187.   case 84 : 
  2188.   case 85 : 
  2189.   case 86 : 
  2190.   case 87 : 
  2191.   case 88 : 
  2192.   case 89 : 
  2193.   case 90 : 
  2194.   case 97 : 
  2195.   case 98 : 
  2196.   case 99 : 
  2197.   case 100 : 
  2198.   case 101 : 
  2199.   case 102 : 
  2200.   case 103 : 
  2201.   case 104 : 
  2202.   case 105 : 
  2203.   case 106 : 
  2204.   case 107 : 
  2205.   case 108 : 
  2206.   case 109 : 
  2207.   case 110 : 
  2208.   case 111 : 
  2209.   case 112 : 
  2210.   case 113 : 
  2211.   case 114 : 
  2212.   case 115 : 
  2213.   case 116 : 
  2214.   case 117 : 
  2215.   case 118 : 
  2216.   case 119 : 
  2217.   case 120 : 
  2218.   case 121 : 
  2219.   case 122 : 
  2220.     {
  2221.       if ( ( ( c == 101 ) || ( c == 69 ) ) && ( loc > 1 ) ) 
  2222.       if ( ( buffer [ loc - 2 ] <= 57 ) && ( buffer [ loc - 2 ] >= 48 ) ) 
  2223.       c = 0 ; 
  2224.       if ( c != 0 ) 
  2225.       {
  2226.     loc = loc - 1 ; 
  2227.     idfirst = loc ; 
  2228.     do {
  2229.         loc = loc + 1 ; 
  2230.       d = buffer [ loc ] ; 
  2231.     } while ( ! ( ( ( d < 48 ) || ( ( d > 57 ) && ( d < 65 ) ) || ( ( d > 
  2232.     90 ) && ( d < 97 ) ) || ( d > 122 ) ) && ( d != 95 ) ) ) ; 
  2233.     if ( loc > idfirst + 1 ) 
  2234.     {
  2235.       c = 130 ; 
  2236.       idloc = loc ; 
  2237.     } 
  2238.       } 
  2239.       else c = 69 ; 
  2240.     } 
  2241.     break ; 
  2242.   case 34 : 
  2243.     {
  2244.       doublechars = 0 ; 
  2245.       idfirst = loc - 1 ; 
  2246.       do {
  2247.       d = buffer [ loc ] ; 
  2248.     loc = loc + 1 ; 
  2249.     if ( ( d == 34 ) || ( d == 64 ) ) 
  2250.     if ( buffer [ loc ] == d ) 
  2251.     {
  2252.       loc = loc + 1 ; 
  2253.       d = 0 ; 
  2254.       doublechars = doublechars + 1 ; 
  2255.     } 
  2256.     else {
  2257.         
  2258.       if ( d == 64 ) 
  2259.       {
  2260.         putc ('\n',  stdout );
  2261.         Fputs( stdout ,  "! Double @ sign missing" ) ; 
  2262.         error () ; 
  2263.       } 
  2264.     } 
  2265.     else if ( loc > limit ) 
  2266.     {
  2267.       {
  2268.         putc ('\n',  stdout );
  2269.         Fputs( stdout ,  "! String constant didn't end" ) ; 
  2270.         error () ; 
  2271.       } 
  2272.       d = 34 ; 
  2273.     } 
  2274.       } while ( ! ( d == 34 ) ) ; 
  2275.       idloc = loc - 1 ; 
  2276.       c = 130 ; 
  2277.     } 
  2278.     break ; 
  2279.   case 64 : 
  2280.     {
  2281.       c = controlcode ( buffer [ loc ] ) ; 
  2282.       loc = loc + 1 ; 
  2283.       if ( c == 0 ) 
  2284.       goto lab20 ; 
  2285.       else if ( c == 13 ) 
  2286.       scanninghex = true ; 
  2287.       else if ( c == 135 ) 
  2288.       {
  2289.     k = 0 ; 
  2290.     while ( true ) {
  2291.         
  2292.       if ( loc > limit ) 
  2293.       {
  2294.         getline () ; 
  2295.         if ( inputhasended ) 
  2296.         {
  2297.           {
  2298.         putc ('\n',  stdout );
  2299.         Fputs( stdout ,  "! Input ended in section name" ) ; 
  2300.         error () ; 
  2301.           } 
  2302.           goto lab30 ; 
  2303.         } 
  2304.       } 
  2305.       d = buffer [ loc ] ; 
  2306.       if ( d == 64 ) 
  2307.       {
  2308.         d = buffer [ loc + 1 ] ; 
  2309.         if ( d == 62 ) 
  2310.         {
  2311.           loc = loc + 2 ; 
  2312.           goto lab30 ; 
  2313.         } 
  2314.         if ( ( d == 32 ) || ( d == 9 ) || ( d == 42 ) ) 
  2315.         {
  2316.           {
  2317.         putc ('\n',  stdout );
  2318.         Fputs( stdout ,  "! Section name didn't end" ) ; 
  2319.         error () ; 
  2320.           } 
  2321.           goto lab30 ; 
  2322.         } 
  2323.         k = k + 1 ; 
  2324.         modtext [ k ] = 64 ; 
  2325.         loc = loc + 1 ; 
  2326.       } 
  2327.       loc = loc + 1 ; 
  2328.       if ( k < longestname - 1 ) 
  2329.       k = k + 1 ; 
  2330.       if ( ( d == 32 ) || ( d == 9 ) ) 
  2331.       {
  2332.         d = 32 ; 
  2333.         if ( modtext [ k - 1 ] == 32 ) 
  2334.         k = k - 1 ; 
  2335.       } 
  2336.       modtext [ k ] = d ; 
  2337.     } 
  2338.     lab30: if ( k >= longestname - 2 ) 
  2339.     {
  2340.       {
  2341.         putc ('\n',  stdout );
  2342.         Fputs( stdout ,  "! Section name too long: " ) ; 
  2343.       } 
  2344.       {register integer for_end; j = 1 ; for_end = 25 ; if ( j <= 
  2345.       for_end) do 
  2346.         putc ( xchr [ modtext [ j ] ] ,  stdout );
  2347.       while ( j++ < for_end ) ; } 
  2348.       Fputs( stdout ,  "..." ) ; 
  2349.       if ( history == 0 ) 
  2350.       history = 1 ; 
  2351.     } 
  2352.     if ( ( modtext [ k ] == 32 ) && ( k > 0 ) ) 
  2353.     k = k - 1 ; 
  2354.     if ( k > 3 ) 
  2355.     {
  2356.       if ( ( modtext [ k ] == 46 ) && ( modtext [ k - 1 ] == 46 ) && ( 
  2357.       modtext [ k - 2 ] == 46 ) ) 
  2358.       curmodule = prefixlookup ( k - 3 ) ; 
  2359.       else curmodule = modlookup ( k ) ; 
  2360.     } 
  2361.     else curmodule = modlookup ( k ) ; 
  2362.       } 
  2363.       else if ( c == 131 ) 
  2364.       {
  2365.     do {
  2366.         c = skipahead () ; 
  2367.     } while ( ! ( c != 64 ) ) ; 
  2368.     if ( buffer [ loc - 1 ] != 62 ) 
  2369.     {
  2370.       putc ('\n',  stdout );
  2371.       Fputs( stdout ,  "! Improper @ within control text" ) ; 
  2372.       error () ; 
  2373.     } 
  2374.     goto lab20 ; 
  2375.       } 
  2376.     } 
  2377.     break ; 
  2378.   case 46 : 
  2379.     if ( buffer [ loc ] == 46 ) 
  2380.     {
  2381.       if ( loc <= limit ) 
  2382.       {
  2383.     c = 32 ; 
  2384.     loc = loc + 1 ; 
  2385.       } 
  2386.     } 
  2387.     else if ( buffer [ loc ] == 41 ) 
  2388.     {
  2389.       if ( loc <= limit ) 
  2390.       {
  2391.     c = 93 ; 
  2392.     loc = loc + 1 ; 
  2393.       } 
  2394.     } 
  2395.     break ; 
  2396.   case 58 : 
  2397.     if ( buffer [ loc ] == 61 ) 
  2398.     {
  2399.       if ( loc <= limit ) 
  2400.       {
  2401.     c = 24 ; 
  2402.     loc = loc + 1 ; 
  2403.       } 
  2404.     } 
  2405.     break ; 
  2406.   case 61 : 
  2407.     if ( buffer [ loc ] == 61 ) 
  2408.     {
  2409.       if ( loc <= limit ) 
  2410.       {
  2411.     c = 30 ; 
  2412.     loc = loc + 1 ; 
  2413.       } 
  2414.     } 
  2415.     break ; 
  2416.   case 62 : 
  2417.     if ( buffer [ loc ] == 61 ) 
  2418.     {
  2419.       if ( loc <= limit ) 
  2420.       {
  2421.     c = 29 ; 
  2422.     loc = loc + 1 ; 
  2423.       } 
  2424.     } 
  2425.     break ; 
  2426.   case 60 : 
  2427.     if ( buffer [ loc ] == 61 ) 
  2428.     {
  2429.       if ( loc <= limit ) 
  2430.       {
  2431.     c = 28 ; 
  2432.     loc = loc + 1 ; 
  2433.       } 
  2434.     } 
  2435.     else if ( buffer [ loc ] == 62 ) 
  2436.     {
  2437.       if ( loc <= limit ) 
  2438.       {
  2439.     c = 26 ; 
  2440.     loc = loc + 1 ; 
  2441.       } 
  2442.     } 
  2443.     break ; 
  2444.   case 40 : 
  2445.     if ( buffer [ loc ] == 42 ) 
  2446.     {
  2447.       if ( loc <= limit ) 
  2448.       {
  2449.     c = 9 ; 
  2450.     loc = loc + 1 ; 
  2451.       } 
  2452.     } 
  2453.     else if ( buffer [ loc ] == 46 ) 
  2454.     {
  2455.       if ( loc <= limit ) 
  2456.       {
  2457.     c = 91 ; 
  2458.     loc = loc + 1 ; 
  2459.       } 
  2460.     } 
  2461.     break ; 
  2462.   case 42 : 
  2463.     if ( buffer [ loc ] == 41 ) 
  2464.     {
  2465.       if ( loc <= limit ) 
  2466.       {
  2467.     c = 10 ; 
  2468.     loc = loc + 1 ; 
  2469.       } 
  2470.     } 
  2471.     break ; 
  2472.   case 32 : 
  2473.   case 9 : 
  2474.     goto lab20 ; 
  2475.     break ; 
  2476.   case 123 : 
  2477.     {
  2478.       skipcomment () ; 
  2479.       goto lab20 ; 
  2480.     } 
  2481.     break ; 
  2482.   case 125 : 
  2483.     {
  2484.       {
  2485.     putc ('\n',  stdout );
  2486.     Fputs( stdout ,  "! Extra }" ) ; 
  2487.     error () ; 
  2488.       } 
  2489.       goto lab20 ; 
  2490.     } 
  2491.     break ; 
  2492.     default: 
  2493.     if ( c >= 128 ) 
  2494.     goto lab20 ; 
  2495.     else ; 
  2496.     break ; 
  2497.   } 
  2498.   lab31: Result = c ; 
  2499.   return(Result) ; 
  2500. void zscannumeric ( p ) 
  2501. namepointer p ; 
  2502. {/* 21 30 */ integer accumulator  ; 
  2503.   schar nextsign  ; 
  2504.   namepointer q  ; 
  2505.   integer val  ; 
  2506.   accumulator = 0 ; 
  2507.   nextsign = 1 ; 
  2508.   while ( true ) {
  2509.       
  2510.     nextcontrol = getnext () ; 
  2511.     lab21: switch ( nextcontrol ) 
  2512.     {case 48 : 
  2513.     case 49 : 
  2514.     case 50 : 
  2515.     case 51 : 
  2516.     case 52 : 
  2517.     case 53 : 
  2518.     case 54 : 
  2519.     case 55 : 
  2520.     case 56 : 
  2521.     case 57 : 
  2522.       {
  2523.     val = 0 ; 
  2524.     do {
  2525.         val = 10 * val + nextcontrol - 48 ; 
  2526.       nextcontrol = getnext () ; 
  2527.     } while ( ! ( ( nextcontrol > 57 ) || ( nextcontrol < 48 ) ) ) ; 
  2528.     {
  2529.       accumulator = accumulator + nextsign * toint ( val ) ; 
  2530.       nextsign = 1 ; 
  2531.     } 
  2532.     goto lab21 ; 
  2533.       } 
  2534.       break ; 
  2535.     case 12 : 
  2536.       {
  2537.     val = 0 ; 
  2538.     nextcontrol = 48 ; 
  2539.     do {
  2540.         val = 8 * val + nextcontrol - 48 ; 
  2541.       nextcontrol = getnext () ; 
  2542.     } while ( ! ( ( nextcontrol > 55 ) || ( nextcontrol < 48 ) ) ) ; 
  2543.     {
  2544.       accumulator = accumulator + nextsign * toint ( val ) ; 
  2545.       nextsign = 1 ; 
  2546.     } 
  2547.     goto lab21 ; 
  2548.       } 
  2549.       break ; 
  2550.     case 13 : 
  2551.       {
  2552.     val = 0 ; 
  2553.     nextcontrol = 48 ; 
  2554.     do {
  2555.         if ( nextcontrol >= 65 ) 
  2556.       nextcontrol = nextcontrol - 7 ; 
  2557.       val = 16 * val + nextcontrol - 48 ; 
  2558.       nextcontrol = getnext () ; 
  2559.     } while ( ! ( ( nextcontrol > 70 ) || ( nextcontrol < 48 ) || ( ( 
  2560.     nextcontrol > 57 ) && ( nextcontrol < 65 ) ) ) ) ; 
  2561.     {
  2562.       accumulator = accumulator + nextsign * toint ( val ) ; 
  2563.       nextsign = 1 ; 
  2564.     } 
  2565.     goto lab21 ; 
  2566.       } 
  2567.       break ; 
  2568.     case 130 : 
  2569.       {
  2570.     q = idlookup ( 0 ) ; 
  2571.     if ( ilk [ q ] != 1 ) 
  2572.     {
  2573.       nextcontrol = 42 ; 
  2574.       goto lab21 ; 
  2575.     } 
  2576.     {
  2577.       accumulator = accumulator + nextsign * toint ( equiv [ q ] - 32768L 
  2578.       ) ; 
  2579.       nextsign = 1 ; 
  2580.     } 
  2581.       } 
  2582.       break ; 
  2583.     case 43 : 
  2584.       ; 
  2585.       break ; 
  2586.     case 45 : 
  2587.       nextsign = - (integer) nextsign ; 
  2588.       break ; 
  2589.     case 132 : 
  2590.     case 133 : 
  2591.     case 135 : 
  2592.     case 134 : 
  2593.     case 136 : 
  2594.       goto lab30 ; 
  2595.       break ; 
  2596.     case 59 : 
  2597.       {
  2598.     putc ('\n',  stdout );
  2599.     Fputs( stdout ,  "! Omit semicolon in numeric definition" ) ; 
  2600.     error () ; 
  2601.       } 
  2602.       break ; 
  2603.       default: 
  2604.       {
  2605.     {
  2606.       putc ('\n',  stdout );
  2607.       Fputs( stdout ,  "! Improper numeric definition will be flushed" ) ; 
  2608.       error () ; 
  2609.     } 
  2610.     do {
  2611.         nextcontrol = skipahead () ; 
  2612.     } while ( ! ( ( nextcontrol >= 132 ) ) ) ; 
  2613.     if ( nextcontrol == 135 ) 
  2614.     {
  2615.       loc = loc - 2 ; 
  2616.       nextcontrol = getnext () ; 
  2617.     } 
  2618.     accumulator = 0 ; 
  2619.     goto lab30 ; 
  2620.       } 
  2621.       break ; 
  2622.     } 
  2623.   } 
  2624.   lab30: ; 
  2625.   if ( abs ( accumulator ) >= 32768L ) 
  2626.   {
  2627.     {
  2628.       putc ('\n',  stdout );
  2629.       fprintf( stdout , "%s%ld",  "! Value too big: " , (long)accumulator ) ; 
  2630.       error () ; 
  2631.     } 
  2632.     accumulator = 0 ; 
  2633.   } 
  2634.   equiv [ p ] = accumulator + 32768L ; 
  2635. void zscanrepl ( t ) 
  2636. eightbits t ; 
  2637. {/* 22 30 31 21 */ sixteenbits a  ; 
  2638.   ASCIIcode b  ; 
  2639.   eightbits bal  ; 
  2640.   bal = 0 ; 
  2641.   while ( true ) {
  2642.       
  2643.     lab22: a = getnext () ; 
  2644.     switch ( a ) 
  2645.     {case 40 : 
  2646.       bal = bal + 1 ; 
  2647.       break ; 
  2648.     case 41 : 
  2649.       if ( bal == 0 ) 
  2650.       {
  2651.     putc ('\n',  stdout );
  2652.     Fputs( stdout ,  "! Extra )" ) ; 
  2653.     error () ; 
  2654.       } 
  2655.       else bal = bal - 1 ; 
  2656.       break ; 
  2657.     case 39 : 
  2658.       {
  2659.     b = 39 ; 
  2660.     while ( true ) {
  2661.         
  2662.       {
  2663.         if ( tokptr [ z ] == maxtoks ) 
  2664.         {
  2665.           putc ('\n',  stdout );
  2666.           fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) 
  2667.           ; 
  2668.           error () ; 
  2669.           history = 3 ; 
  2670.           uexit ( 1 ) ; 
  2671.         } 
  2672.         tokmem [ z ][ tokptr [ z ] ] = b ; 
  2673.         tokptr [ z ] = tokptr [ z ] + 1 ; 
  2674.       } 
  2675.       if ( b == 64 ) 
  2676.       if ( buffer [ loc ] == 64 ) 
  2677.       loc = loc + 1 ; 
  2678.       else {
  2679.           
  2680.         putc ('\n',  stdout );
  2681.         Fputs( stdout ,  "! You should double @ signs in strings" ) ; 
  2682.         error () ; 
  2683.       } 
  2684.       if ( loc == limit ) 
  2685.       {
  2686.         {
  2687.           putc ('\n',  stdout );
  2688.           Fputs( stdout ,  "! String didn't end" ) ; 
  2689.           error () ; 
  2690.         } 
  2691.         buffer [ loc ] = 39 ; 
  2692.         buffer [ loc + 1 ] = 0 ; 
  2693.       } 
  2694.       b = buffer [ loc ] ; 
  2695.       loc = loc + 1 ; 
  2696.       if ( b == 39 ) 
  2697.       {
  2698.         if ( buffer [ loc ] != 39 ) 
  2699.         goto lab31 ; 
  2700.         else {
  2701.         
  2702.           loc = loc + 1 ; 
  2703.           {
  2704.         if ( tokptr [ z ] == maxtoks ) 
  2705.         {
  2706.           putc ('\n',  stdout );
  2707.           fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" ,                   " capacity exceeded" ) ; 
  2708.           error () ; 
  2709.           history = 3 ; 
  2710.           uexit ( 1 ) ; 
  2711.         } 
  2712.         tokmem [ z ][ tokptr [ z ] ] = 39 ; 
  2713.         tokptr [ z ] = tokptr [ z ] + 1 ; 
  2714.           } 
  2715.         } 
  2716.       } 
  2717.     } 
  2718.     lab31: ; 
  2719.       } 
  2720.       break ; 
  2721.     case 35 : 
  2722.       if ( t == 3 ) 
  2723.       a = 0 ; 
  2724.       break ; 
  2725.     case 130 : 
  2726.       {
  2727.     a = idlookup ( 0 ) ; 
  2728.     {
  2729.       if ( tokptr [ z ] == maxtoks ) 
  2730.       {
  2731.         putc ('\n',  stdout );
  2732.         fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) ; 
  2733.         error () ; 
  2734.         history = 3 ; 
  2735.         uexit ( 1 ) ; 
  2736.       } 
  2737.       tokmem [ z ][ tokptr [ z ] ] = ( a / 256 ) + 128 ; 
  2738.       tokptr [ z ] = tokptr [ z ] + 1 ; 
  2739.     } 
  2740.     a = a % 256 ; 
  2741.       } 
  2742.       break ; 
  2743.     case 135 : 
  2744.       if ( t != 135 ) 
  2745.       goto lab30 ; 
  2746.       else {
  2747.       
  2748.     {
  2749.       if ( tokptr [ z ] == maxtoks ) 
  2750.       {
  2751.         putc ('\n',  stdout );
  2752.         fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) ; 
  2753.         error () ; 
  2754.         history = 3 ; 
  2755.         uexit ( 1 ) ; 
  2756.       } 
  2757.       tokmem [ z ][ tokptr [ z ] ] = ( curmodule / 256 ) + 168 ; 
  2758.       tokptr [ z ] = tokptr [ z ] + 1 ; 
  2759.     } 
  2760.     a = curmodule % 256 ; 
  2761.       } 
  2762.       break ; 
  2763.     case 2 : 
  2764.       {
  2765.     {
  2766.       if ( tokptr [ z ] == maxtoks ) 
  2767.       {
  2768.         putc ('\n',  stdout );
  2769.         fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) ; 
  2770.         error () ; 
  2771.         history = 3 ; 
  2772.         uexit ( 1 ) ; 
  2773.       } 
  2774.       tokmem [ z ][ tokptr [ z ] ] = 2 ; 
  2775.       tokptr [ z ] = tokptr [ z ] + 1 ; 
  2776.     } 
  2777.     buffer [ limit + 1 ] = 64 ; 
  2778.     lab21: if ( buffer [ loc ] == 64 ) 
  2779.     {
  2780.       if ( loc < limit ) 
  2781.       if ( buffer [ loc + 1 ] == 64 ) 
  2782.       {
  2783.         {
  2784.           if ( tokptr [ z ] == maxtoks ) 
  2785.           {
  2786.         putc ('\n',  stdout );
  2787.         fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded"                 ) ; 
  2788.         error () ; 
  2789.         history = 3 ; 
  2790.         uexit ( 1 ) ; 
  2791.           } 
  2792.           tokmem [ z ][ tokptr [ z ] ] = 64 ; 
  2793.           tokptr [ z ] = tokptr [ z ] + 1 ; 
  2794.         } 
  2795.         loc = loc + 2 ; 
  2796.         goto lab21 ; 
  2797.       } 
  2798.     } 
  2799.     else {
  2800.         
  2801.       {
  2802.         if ( tokptr [ z ] == maxtoks ) 
  2803.         {
  2804.           putc ('\n',  stdout );
  2805.           fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) 
  2806.           ; 
  2807.           error () ; 
  2808.           history = 3 ; 
  2809.           uexit ( 1 ) ; 
  2810.         } 
  2811.         tokmem [ z ][ tokptr [ z ] ] = buffer [ loc ] ; 
  2812.         tokptr [ z ] = tokptr [ z ] + 1 ; 
  2813.       } 
  2814.       loc = loc + 1 ; 
  2815.       goto lab21 ; 
  2816.     } 
  2817.     if ( loc >= limit ) 
  2818.     {
  2819.       putc ('\n',  stdout );
  2820.       Fputs( stdout ,  "! Verbatim string didn't end" ) ; 
  2821.       error () ; 
  2822.     } 
  2823.     else if ( buffer [ loc + 1 ] != 62 ) 
  2824.     {
  2825.       putc ('\n',  stdout );
  2826.       Fputs( stdout ,  "! You should double @ signs in verbatim strings" ) 
  2827.       ; 
  2828.       error () ; 
  2829.     } 
  2830.     loc = loc + 2 ; 
  2831.       } 
  2832.       break ; 
  2833.     case 133 : 
  2834.     case 132 : 
  2835.     case 134 : 
  2836.       if ( t != 135 ) 
  2837.       goto lab30 ; 
  2838.       else {
  2839.       
  2840.     {
  2841.       putc ('\n',  stdout );
  2842.       fprintf( stdout , "%s%c%s",  "! @" , xchr [ buffer [ loc - 1 ] ] ,           " is ignored in Pascal text" ) ; 
  2843.       error () ; 
  2844.     } 
  2845.     goto lab22 ; 
  2846.       } 
  2847.       break ; 
  2848.     case 136 : 
  2849.       goto lab30 ; 
  2850.       break ; 
  2851.       default: 
  2852.       ; 
  2853.       break ; 
  2854.     } 
  2855.     {
  2856.       if ( tokptr [ z ] == maxtoks ) 
  2857.       {
  2858.     putc ('\n',  stdout );
  2859.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) ; 
  2860.     error () ; 
  2861.     history = 3 ; 
  2862.     uexit ( 1 ) ; 
  2863.       } 
  2864.       tokmem [ z ][ tokptr [ z ] ] = a ; 
  2865.       tokptr [ z ] = tokptr [ z ] + 1 ; 
  2866.     } 
  2867.   } 
  2868.   lab30: nextcontrol = a ; 
  2869.   if ( bal > 0 ) 
  2870.   {
  2871.     if ( bal == 1 ) 
  2872.     {
  2873.       putc ('\n',  stdout );
  2874.       Fputs( stdout ,  "! Missing )" ) ; 
  2875.       error () ; 
  2876.     } 
  2877.     else {
  2878.     
  2879.       putc ('\n',  stdout );
  2880.       fprintf( stdout , "%s%ld%s",  "! Missing " , (long)bal , " )'s" ) ; 
  2881.       error () ; 
  2882.     } 
  2883.     while ( bal > 0 ) {
  2884.     
  2885.       {
  2886.     if ( tokptr [ z ] == maxtoks ) 
  2887.     {
  2888.       putc ('\n',  stdout );
  2889.       fprintf( stdout , "%s%s%s",  "! Sorry, " , "token" , " capacity exceeded" ) ; 
  2890.       error () ; 
  2891.       history = 3 ; 
  2892.       uexit ( 1 ) ; 
  2893.     } 
  2894.     tokmem [ z ][ tokptr [ z ] ] = 41 ; 
  2895.     tokptr [ z ] = tokptr [ z ] + 1 ; 
  2896.       } 
  2897.       bal = bal - 1 ; 
  2898.     } 
  2899.   } 
  2900.   if ( textptr > maxtexts - 4 ) 
  2901.   {
  2902.     putc ('\n',  stdout );
  2903.     fprintf( stdout , "%s%s%s",  "! Sorry, " , "text" , " capacity exceeded" ) ; 
  2904.     error () ; 
  2905.     history = 3 ; 
  2906.     uexit ( 1 ) ; 
  2907.   } 
  2908.   currepltext = textptr ; 
  2909.   tokstart [ textptr + 4 ] = tokptr [ z ] ; 
  2910.   textptr = textptr + 1 ; 
  2911.   if ( z == 3 ) 
  2912.   z = 0 ; 
  2913.   else z = z + 1 ; 
  2914. void zdefinemacro ( t ) 
  2915. eightbits t ; 
  2916. {namepointer p  ; 
  2917.   p = idlookup ( t ) ; 
  2918.   scanrepl ( t ) ; 
  2919.   equiv [ p ] = currepltext ; 
  2920.   textlink [ currepltext ] = 0 ; 
  2921. void scanmodule ( ) 
  2922. {/* 22 30 10 */ namepointer p  ; 
  2923.   modulecount = modulecount + 1 ; 
  2924.   nextcontrol = 0 ; 
  2925.   while ( true ) {
  2926.       
  2927.     lab22: while ( nextcontrol <= 132 ) {
  2928.     
  2929.       nextcontrol = skipahead () ; 
  2930.       if ( nextcontrol == 135 ) 
  2931.       {
  2932.     loc = loc - 2 ; 
  2933.     nextcontrol = getnext () ; 
  2934.       } 
  2935.     } 
  2936.     if ( nextcontrol != 133 ) 
  2937.     goto lab30 ; 
  2938.     nextcontrol = getnext () ; 
  2939.     if ( nextcontrol != 130 ) 
  2940.     {
  2941.       {
  2942.     putc ('\n',  stdout );
  2943.     fprintf( stdout , "%s%s",  "! Definition flushed, must start with " ,         "identifier of length > 1" ) ; 
  2944.     error () ; 
  2945.       } 
  2946.       goto lab22 ; 
  2947.     } 
  2948.     nextcontrol = getnext () ; 
  2949.     if ( nextcontrol == 61 ) 
  2950.     {
  2951.       scannumeric ( idlookup ( 1 ) ) ; 
  2952.       goto lab22 ; 
  2953.     } 
  2954.     else if ( nextcontrol == 30 ) 
  2955.     {
  2956.       definemacro ( 2 ) ; 
  2957.       goto lab22 ; 
  2958.     } 
  2959.     else if ( nextcontrol == 40 ) 
  2960.     {
  2961.       nextcontrol = getnext () ; 
  2962.       if ( nextcontrol == 35 ) 
  2963.       {
  2964.     nextcontrol = getnext () ; 
  2965.     if ( nextcontrol == 41 ) 
  2966.     {
  2967.       nextcontrol = getnext () ; 
  2968.       if ( nextcontrol == 61 ) 
  2969.       {
  2970.         {
  2971.           putc ('\n',  stdout );
  2972.           Fputs( stdout ,  "! Use == for macros" ) ; 
  2973.           error () ; 
  2974.         } 
  2975.         nextcontrol = 30 ; 
  2976.       } 
  2977.       if ( nextcontrol == 30 ) 
  2978.       {
  2979.         definemacro ( 3 ) ; 
  2980.         goto lab22 ; 
  2981.       } 
  2982.     } 
  2983.       } 
  2984.     } 
  2985.     {
  2986.       putc ('\n',  stdout );
  2987.       Fputs( stdout ,  "! Definition flushed since it starts badly" ) ; 
  2988.       error () ; 
  2989.     } 
  2990.   } 
  2991.   lab30: ; 
  2992.   switch ( nextcontrol ) 
  2993.   {case 134 : 
  2994.     p = 0 ; 
  2995.     break ; 
  2996.   case 135 : 
  2997.     {
  2998.       p = curmodule ; 
  2999.       do {
  3000.       nextcontrol = getnext () ; 
  3001.       } while ( ! ( nextcontrol != 43 ) ) ; 
  3002.       if ( ( nextcontrol != 61 ) && ( nextcontrol != 30 ) ) 
  3003.       {
  3004.     {
  3005.       putc ('\n',  stdout );
  3006.       Fputs( stdout ,  "! Pascal text flushed, = sign is missing" ) ; 
  3007.       error () ; 
  3008.     } 
  3009.     do {
  3010.         nextcontrol = skipahead () ; 
  3011.     } while ( ! ( nextcontrol == 136 ) ) ; 
  3012.     goto lab10 ; 
  3013.       } 
  3014.     } 
  3015.     break ; 
  3016.     default: 
  3017.     goto lab10 ; 
  3018.     break ; 
  3019.   } 
  3020.   storetwobytes ( 53248L + modulecount ) ; 
  3021.   scanrepl ( 135 ) ; 
  3022.   if ( p == 0 ) 
  3023.   {
  3024.     textlink [ lastunnamed ] = currepltext ; 
  3025.     lastunnamed = currepltext ; 
  3026.   } 
  3027.   else if ( equiv [ p ] == 0 ) 
  3028.   equiv [ p ] = currepltext ; 
  3029.   else {
  3030.       
  3031.     p = equiv [ p ] ; 
  3032.     while ( textlink [ p ] < maxtexts ) p = textlink [ p ] ; 
  3033.     textlink [ p ] = currepltext ; 
  3034.   } 
  3035.   textlink [ currepltext ] = maxtexts ; 
  3036.   lab10: ; 
  3037. void main_body() {
  3038.     
  3039.   initialize () ; 
  3040.   openinput () ; 
  3041.   line = 0 ; 
  3042.   otherline = 0 ; 
  3043.   changing = true ; 
  3044.   primethechangebuffer () ; 
  3045.   changing = ! changing ; 
  3046.   templine = otherline ; 
  3047.   otherline = line ; 
  3048.   line = templine ; 
  3049.   limit = 0 ; 
  3050.   loc = 1 ; 
  3051.   buffer [ 0 ] = 32 ; 
  3052.   inputhasended = false ; 
  3053.   Fputs( stdout ,  "This is TANGLE, Version 4.3" ) ; 
  3054.   fprintf( stdout , "%s\n",  versionstring ) ; 
  3055.   phaseone = true ; 
  3056.   modulecount = 0 ; 
  3057.   do {
  3058.       nextcontrol = skipahead () ; 
  3059.   } while ( ! ( nextcontrol == 136 ) ) ; 
  3060.   while ( ! inputhasended ) scanmodule () ; 
  3061.   if ( changelimit != 0 ) 
  3062.   {
  3063.     {register integer for_end; ii = 0 ; for_end = changelimit ; if ( ii <= 
  3064.     for_end) do 
  3065.       buffer [ ii ] = changebuffer [ ii ] ; 
  3066.     while ( ii++ < for_end ) ; } 
  3067.     limit = changelimit ; 
  3068.     changing = true ; 
  3069.     line = otherline ; 
  3070.     loc = changelimit ; 
  3071.     {
  3072.       putc ('\n',  stdout );
  3073.       Fputs( stdout ,  "! Change file entry did not match" ) ; 
  3074.       error () ; 
  3075.     } 
  3076.   } 
  3077.   phaseone = false ; 
  3078.   if ( textlink [ 0 ] == 0 ) 
  3079.   {
  3080.     {
  3081.       putc ('\n',  stdout );
  3082.       Fputs( stdout ,  "! No output was specified." ) ; 
  3083.     } 
  3084.     if ( history == 0 ) 
  3085.     history = 1 ; 
  3086.   } 
  3087.   else {
  3088.       
  3089.     {
  3090.       putc ('\n',  stdout );
  3091.       Fputs( stdout ,  "Writing the output file" ) ; 
  3092.     } 
  3093.     flush ( stdout ) ; 
  3094.     stackptr = 1 ; 
  3095.     bracelevel = 0 ; 
  3096.     curstate .namefield = 0 ; 
  3097.     curstate .replfield = textlink [ 0 ] ; 
  3098.     zo = curstate .replfield % 4 ; 
  3099.     curstate .bytefield = tokstart [ curstate .replfield ] ; 
  3100.     curstate .endfield = tokstart [ curstate .replfield + 4 ] ; 
  3101.     curstate .modfield = 0 ; 
  3102.     outstate = 0 ; 
  3103.     outptr = 0 ; 
  3104.     breakptr = 0 ; 
  3105.     semiptr = 0 ; 
  3106.     outbuf [ 0 ] = 0 ; 
  3107.     line = 1 ; 
  3108.     sendtheoutput () ; 
  3109.     breakptr = outptr ; 
  3110.     semiptr = 0 ; 
  3111.     flushbuffer () ; 
  3112.     if ( bracelevel != 0 ) 
  3113.     {
  3114.       putc ('\n',  stdout );
  3115.       fprintf( stdout , "%s%ld",  "! Program ended at brace level " , (long)bracelevel ) ; 
  3116.       error () ; 
  3117.     } 
  3118.     {
  3119.       putc ('\n',  stdout );
  3120.       Fputs( stdout ,  "Done." ) ; 
  3121.     } 
  3122.   } 
  3123.   lab9999: if ( stringptr > 256 ) 
  3124.   {
  3125.     {
  3126.       putc ('\n',  stdout );
  3127.       fprintf( stdout , "%ld%s",  (long)stringptr - 256 ,       " strings written to string pool file." ) ; 
  3128.     } 
  3129.     putc ( '*' ,  pool );
  3130.     {register integer for_end; ii = 1 ; for_end = 9 ; if ( ii <= for_end) do 
  3131.       {
  3132.     outbuf [ ii ] = poolchecksum % 10 ; 
  3133.     poolchecksum = poolchecksum / 10 ; 
  3134.       } 
  3135.     while ( ii++ < for_end ) ; } 
  3136.     {register integer for_end; ii = 9 ; for_end = 1 ; if ( ii >= for_end) do 
  3137.       putc ( xchr [ 48 + outbuf [ ii ] ] ,  pool );
  3138.     while ( ii-- > for_end ) ; } 
  3139.     putc ('\n',  pool );
  3140.   } 
  3141.   switch ( history ) 
  3142.   {case 0 : 
  3143.     {
  3144.       putc ('\n',  stdout );
  3145.       Fputs( stdout ,  "(No errors were found.)" ) ; 
  3146.     } 
  3147.     break ; 
  3148.   case 1 : 
  3149.     {
  3150.       putc ('\n',  stdout );
  3151.       Fputs( stdout ,  "(Did you see the warning message above?)" ) ; 
  3152.     } 
  3153.     break ; 
  3154.   case 2 : 
  3155.     {
  3156.       putc ('\n',  stdout );
  3157.       Fputs( stdout ,  "(Pardon me, but I think I spotted something wrong.)" ) 
  3158.       ; 
  3159.     } 
  3160.     break ; 
  3161.   case 3 : 
  3162.     {
  3163.       putc ('\n',  stdout );
  3164.       Fputs( stdout ,  "(That was a fatal error, my friend.)" ) ; 
  3165.     } 
  3166.     break ; 
  3167.   } 
  3168.   putc ('\n',  stdout );
  3169.   if ( ( history != 0 ) && ( history != 1 ) ) 
  3170.   uexit ( 1 ) ; 
  3171.   else uexit ( 0 ) ; 
  3172.